PGI® 9.0 のリリース・ノートの詳細版は、PDF ファイルで提供しております。
サポートするプラットフォーム
- 32ビット Linux - 32ビット x86 互換あるいは 64ビット x64 互換のプロセッサ上で動作する 32ビットLinux オペレーティングシステム上で利用可能です。
- 64ビット/32ビットLinux - 32ビット Linux 製品の全ての機能を包括し、64 ビット x64 互換のプロセッサ上で動作する 64 ビット Linux オペレーティングシステム上で利用可能です。
- 32ビット Windows -32ビット x86互換あるいは 64ビット x64 互換のプロセッサ上で動作する32ビットWindowsオペレーティングシステム上で利用可能です。
- 64ビット/32ビットWindows - 32ビットWindows(R) 製品の全ての機能を包括し、64ビットx64 互換のプロセッサ上で動作する 64ビットWindows(R)オペレーティングシステム上で利用可能です。
- 32ビットApple Mac OS X - 32ビットあるいは 64 ビットの Intel(R) ベースのプロセッサを搭載したシステムで、32ビットApple Mac オペレーティングシステム上で利用可能です。
- 64ビットApple Mac OS X - 64ビットの Intel(R) ベースのプロセッサを搭載したシステムで、64ビットApple Mac オペレーティングシステム上で利用可能です。
- 32ビット SFU - 32ビットx86互換あるいは64ビットx64互換のプロセッサ上で動作する32ビットWindows(R) オペレーティングシステム上の SFU
(Windows Service for Unix) で利用可能です。(Windows(R) 製品のライセンスキーが必要です)
- 32ビット SUA - 32ビットx86互換あるいは64ビットx64互換のプロセッサ上で動作する32ビットWindows(R) オペレーティングシステム上の SUA
(the Subsystem for Unix-base Applications) で利用可能です。(Windows(R) 製品のライセンスキーが必要です)
- 64ビット/32ビットSUA - 32ビットSUAの全ての機能を包括し、64ビットx64互換のプロセッサ上で動作する 64ビット Windows(R) オペレーティングシステム上の SUA
(the Subsystem for Unix-base Applications) で利用可能です。(Windows(R) 製品のライセンスキーが必要です)
サポートするプロセッサタイプ
32ビット x86 系のプロセッサ並びに 64ビットの AMD64、Intel(R) 64 のプロセッサに対応します。PGI 9.0 において、サポートする
CPU は以下の表のとおりです。
新たに、インテル社の Core i7 (Nehalem)プロセッサ、AMD Opteron (Istanbul: 6コア) 用の最適化をサポートしました。
PGI コンパイラは、AMD64 ネイティブな最適化と Intel(R) インテル64 用の最適化を切り替えることが可能なクロス・コンパイル機能を有します。さらに、PGI コンパイラは、一つの実行モジュールフファイルで、AMD64 あるいは EM64T のどちらにも最適な性能を提供可能な
PGI Unified Binaries の機能を業界で初めて提供しております。PGI コンパイラを利用することで、将来、ご使用システムを Intel 64(EM64T) もしくは
AMD64 のどちらかの CPU プラットフォームに変更したとしても、最適化された共通コンパイラ基盤としてどちらのプラットフォームに対してもご利用いただけます。PGI
9.0 コンパイラがサポートするプロセッサの詳細に関しては、こちらをご覧ください。
PGI がサポートするプロセッサのデフォルトで使用するハードウェア機構
| prosessor |
Prefetch |
SSE1 |
SSE2 |
SSE3 |
32-bit |
64-bit |
Scalar FP
Default |
| AMD |
Athlon |
|
|
|
|
○ |
|
x87 |
| AMD |
Athlon XP/MP |
○ |
○ |
|
|
○ |
|
x87 |
| AMD |
Athlon64 |
○ |
○ |
○ |
|
○ |
○ |
SSE |
| AMD |
Opteron |
○ |
○ |
○ |
|
○ |
○ |
SSE |
| AMD |
Opteron Rev.E/F |
○ |
○ |
○ |
○ |
○ |
○ |
SSE |
| AMD |
Opteron/Quad-Core |
○ |
○ |
○ |
○ |
○ |
○ |
SSE |
| AMD |
Turion |
○ |
○ |
○ |
○ |
○ |
○ |
SSE |
| AMD |
Opteron (Istanbul) |
○ |
○ |
○ |
○ |
○ |
○ |
SSE |
| Intel(R) |
Celeron |
|
|
|
|
○ |
|
x87 |
| Intel(R) |
Pentium II |
|
|
|
|
○ |
|
x87 |
| Intel(R) |
Pentium III |
○ |
○ |
|
|
○ |
|
x87 |
| Intel(R) |
Pentium 4 |
○ |
○ |
○ |
|
○ |
|
SSE |
| Intel(R) |
Pentium M |
○ |
○ |
○ |
|
○ |
|
SSE |
| Intel(R) |
Centrino |
○ |
○ |
○ |
|
○ |
|
SSE |
| Intel(R) |
Pentium 4 EM64T |
○ |
○ |
○ |
○ |
○ |
○ |
SSE |
| Intel(R) |
Xeon EM64T |
○ |
○ |
○ |
○ |
○ |
○ |
SSE |
| Intel(R) |
Core Duo EM64T |
○ |
○ |
○ |
○ |
○ |
○ |
SSE |
| Intel(R) |
Core 2 Duo EM64T |
○ |
○ |
○ |
○ |
○ |
○ |
SSE |
| Intel(R) |
Penryn
(Quad core) |
○ |
○ |
○ |
○ |
○ |
○ |
SSE |
| Intel(R) |
Core i7
(Nehalem) |
○ |
○ |
○ |
○ |
○ |
○ |
SSE |
サポートするOS の追加
Linux 版においては、RedHat Enterprise Linux 5.3 、SUSE LINUX 11.1、SLES 11 並びに Federa
Core 10, 11 ,Ubuntu 9.04 をサポートしました。PGI 9.0 において、サポートする OS はこちらをご覧ください。
なお、PGI 7.0以前でサポートしておりました、古い Linux DistributionであるRedHat 8.0/7.3、SuSE 8.1/8.0、SLES8
SP2は、PGI 7.2 以降サポートしておりませんのでご注意ください。
PGI 9.0 の新コンパイラ・オプションと従来との変更部分(2009年6月)
PGI コンパイラ 9.0 において新規に導入されたオプションについて説明 しているPDF ファイルです。
- 未知のコンパイラ・オプションを指定した場合、今までは「警告」レベルの扱いでしたが、PGI 8.0 より、「エラー」として扱われます。この変更によって、コンパイラが認識できないオプション(スイッチ)が指定された場合、コンパイルエラーとなり停止することになります。
一例 : pgf95-Error-Unknown switch: -Mconcu
しかしながら、新しいコンパイラ・オプションである -noswitcherror を指定すると、従来のように、未知のオプション(スイッチ)が指定された場合、エラーで停止するの代わりに「警告」を出すように変更できます。
次のオプションは、PGI 8.0 から追加あるいは、修正されたものです。
- -tp : 六つの新しいターゲットCPUタイプ
| istanbul |
AMD istanbul プロセッサ 32-bit mode |
| istanbul-32 |
AMD istanbulプロセッサ, 32-bit mode |
| istanbul-64 |
AMD istanbul プロセッサ, 64-bit mode |
| nehalem |
Intel Core i7 (Nehalem) プロセッサ 32-bit mode |
| nehalem-32 |
Intel Core i7 (Nehalem) プロセッサ 32-bit mode |
| nehalem-64 |
Intel Core i7 (Nehalem) プロセッサ 64-bit mode |
- -ta=nvidia (,nvidia_suboptions), host : PGI アクセラレータ・コンパイラに伴う新しいオプションです。-ta は、ターゲット・アーキテクチャを意味します。Fortranにおける
!$ACC ディレクティブ、C における #pragma acc ディレクティブをコンパイラに認識させるために、このオプションを使用します。これは、Fortran
並びに C コンパイラのみで有効です。このオプションは、以下のサブオプションを有します。
* nvidia - NVIDIAアクセラレータをターゲットとして選択します。さらに、以下の nvidia 用のサブオプションがあります。
- analysis ループの解析のみ行い、コードの生成を行いません
- cc10 compute capability 1.0 のコードを生成
- cc11 compute capability 1.1 のコードを生成
- cc13 compute capability 1.3 のコードを生成
- nofma fused-multiply-add命令を生成しない
- time アクセラレータ領域の単純な時間情報を集積するためにプロファイル・ライブラリをリンクする
* host - アクセラレータがターゲットとして存在しないコード生成を行う。アクセラレータ領域をホスト側で実行するようにコンパイルする。PGI Unified
Binaryコードを生成します。
- -Minfo : 新サブオプションが追加されました。
accel アクセラレータ領域を GPU Kernel に翻訳することが成功したかどうかの情報を示す。
- -Msmartalloc : 新しいサブオプションが追加されました。
nohuge -Msmartalloc=huge を上書き(無効化)するサブオプションです。
- -M[no]m128 ? __m128, __m128d, __m128i : データ型を認識するための新しいオプションです。[C コンパイラのみ]
- -Mfprelaxed : 新しいサブオプションが追加されました。
recip 緩和した精度で逆数近似する。
- -O に新しいサブオプションが追加されました。
- 全てのレベル1、2、3の最適化を実施した上で、 hoisting of guarded invariant floating point expressions
の最適化を行います。
- -Minstrument [=functions] : 新しいサブオプションが追加されました。
Common Compiler Feedback Format (CCFF) を使用して、 PGI コンパイラは、どのようにプログラムの最適化を行ったら良いか、あるいは、特定の最適化がなされないのか等の関数レベルのinstrument情報をオブジェクトに保持することを可能とします。-Minstrument=functions
の指定も -Minstrument と同じ意味となります。このオプションは、-Minfo=ccff -Mframe の二つを指定したことと同意です。
[linux86-64 のみ]
- -Mipa : 新サブオプションが追加されました。
nopfo プロファイル・フィードバック情報の引用回数情報を無視する。このサブオプションは、inlineサブオプションの次に指定されているときのみ有効となります。-Mipa=inline,nopfo は、IPA手続きに対して、PFO情報が有効な状態において、インラインされる関数を決める際に、PFO情報を無視するように伝えます。
- -Mallocatable=[95|03] : このオプションは、割り付け方法の取り扱いを制御するものです。デフォルトの振る舞い方は、Fortran 95 のセマンテックを採用し、03 サブオプションを指定すると、Fortran
2003 セマンテックを採用するようにコンパイラに指示します。
新規導入ディレクティブ
このリリースにおいて、以下のコンパイラ・ディレクティブを新規追加しました。
* IGNORE_TKR
このディレクティブは、コンパイラに対して、kindあるいは、InterfaceやProcedureの中の指定された仮引数のランクを無視するように指示するものです。また、コンパイラは、genericな呼び出し時に曖昧性がある全ての指定をチェックするような場合、型、kind、実引数のランクを無視します。
Fortranの強化
■ FortranとCの相互運用性の強化
Fortran 2003は、C言語との相互運用性のメカニズムを提供しています。この相互運用に係わる任意のentity は、C と Fortran
の両方で等価な宣言を行わなければなりません。PGI は、これらのコンポーネントを追加することにより、C との相互運用性を拡張します。
- Enumerators(ENUM構文) 整数定数のセットです。種別型 kind は、C 言語の同じ定数で選択した整数型に対応します。
- ISO_C_BINDING モジュール(本リリースで実装)
- BIND属性は、派生型と C 言語の型にマップするするための定数 kind の定義に対してサポートされます。
- Procedureでは、VALUE と BIND 属性並びにグローバルデータに対する BIND 属性がサポートされます。
- Procedure C_LOC がサポートされました。これは、オブジェクトのCアドレスを返します。
- ポインタ型 - 派生型 c_ptrは、C言語のポインタ型との相互運用性を確保します。また、名前付き定数c_null_ptrは、C 言語のヌル値と対応します。
- C_f_pointer :cptrをFortranポインタfptrへ C言語のアドレスを指示先として指示するサブルーチンです。また、そのオプションとして、配列の形状をshapeを指定することができます。構文は次の通りです。c_f_pointer
(cptr, fptr [,shape])
これらコンポーネントの詳細は、PGI Fortran Referenceの章である「C言語との相互運用」をご参照下さい。
■ 新しいFortran文とassignment
ここで述べる文(statement)は、PGI 9.0 で新たに加えられたものです。これらの詳細な説明は、PGI Fortran Referenceマニュアルをご参照下さい。
- IMPORT : interface body の中だけで使用されます。この文は、親の有効域から名前付き要素がインポートされます。
- Pointer Assignment : Fortran 2003 は、配列に対するポインタ割り当てを拡張しました。下限と上限の配列境界は指定できるようになります。
構文 : p(0:、0:)=> a この下限境界値は、上限値が指定されている場合、人誌のスカラ整数式で指定できます。ターゲットとなる配列の要素の再構成も以下の例のように可能です。 p(1:m,1:2*m)
=> a(1:2*m)
- Volatile Attribute : Fortran 2003 においては、型宣言文で使用されます。これは、コンパイラに対して、変数が変更されること、あるいは、Fortranプログラム以外から検証されることを指示するものです。
構文: datatype, volatile :: var_name or datatype :: var_name
volatile :: var_name
次の例は、整数変数 xyz と実数変数 abc の両方を volatile として宣言したものです。
integer, volatile :: xyz
real :: abc
volatile :: abc
■ 新しいFortran組込関数(intrinsic)
固有の関数 (intrinsic) は、指定された言語上のコンパイラによって実装された(組込まれた)関数です。従って、コンパイラは、親和性の高い固有関数の知識を有するため、より質の高い統合や最適化を行うことが可能となります。このリリースでは、
PGIは以下のintrinsic を強化しました。
* LEADZ(I) : 変数 I の内部表現のleading zeroビットの数を返す。
* POPCNT(I) : 変数Iの内部表現の "1" ビットの数を返す。
* POPPAR(I) : 変数Iの内部表現の"bitwise parit"を返す。
* MOVE_ALLOC(TO,FROM) : 割付けを一つの割付けオブジェクトから他の割付けへ移動する。戻り値はない。
次の組込み関数、あるいは手続きはKIND引数が追加されました。以下の組込関数のためのKIND引数は、スカラ整数で初期化された式で表されます。KIND引数はオプションですが、これが指定されると、その戻り値は、指定されたkindの種別となります。
* ACHAR(I [,KIND])
* IACHAR(C [,KIND])
* ICHAR(C [,KIND])
* INDEX(STRING, SUBSTRING [,BACK[, KIND ]])
* LBOUND(ARRAY [,DIM[,KIND]])
* LEN(STRING [,KIND])
* LEN_TRIM(STRING [,KIND])
* MAXLOC(ARRAY [,DIM] [,MASK] [,KIND])
* MINLOC(ARRAY [,DIM] [,MASK] [,KIND])
* SCAN(STRING, SET [,BACK[,KIND])
* SHAPE(SOURCE [,KIND])
* SIZE(ARRAY [,DIM[,KIND]])
* UBOUND(ARRAY [,DIM[,KIND]]) -
* VERIFY(STRING, SET [,BACK[,KIND]])
■ 新しい組込みモジュール
PGI 9.0 は、Fortran組込みモジュールiso_fortran_env をサポートしました。この組込みモジュールは、名前付き定数の使用を通して、Fortran環境についての情報を提供します。
- character_storage_size :文字・ストレージユニットのサイズ(ビット)
- error_unit - :エラーを報告するために適した予め接続されている出力ユニット番号。これは出力ユニットと同じ場合もある。
- file_storage_size :ファイル・ストレージユニットのサイズ(ビット)
- nput_unit :入力のために予め接続されているユニット番号
- iostat_end :READ文実行中にend-of-file状態を示すIOSTAT= によって返す戻り値
- iostat_eor :READ文実行中にend-of-record状態を示すIOSTAT= によって返す戻り値
- numeric_storage_size :numericalストレージユニットのサイズ(ビット)
- output_unit :出力のために予め接続されている外部ユニット番号
上記の指定されたユニット番号は、負になる可能性もあります。但し、-1は他の目的で使用されているため、使用できません。
これら組込みモジュールの詳細は、PGI Fortran Referenceの章である「Intrinsics Modulesセクション」をご参照下さい。
■ 配列に関する強化
以下の事項は、配列に関するFortran 2003の仕様です。
- Allocatable attribute : Allocate 文の属性指定で、固定rankを持った配列を指定できます。ただし、配列形状については、今後のリリースにて利用可能となります。
- Fortran 2003 allocatable regularization : PGF95に実装されます。これは、いつも有効となっております。これらの変更によって、仮引数として渡される割り付け配列の使用が可能となります。
- Fortran 2003 Allocatable Array Assignment : PGF95に実装されます。デフォルトは、Fortran95割り当てセマンテックスが使用されますが、オプション-Mallocatable=03を指定することによって、Fortran
2003セマンテックスが使用されます。
■ その他のFortran強化
- Fortran 2003 Asynchronous Input/Output :Fortran 2003非同期I/O は、一部、PGF77 とPGF95
コンパイラに実装されております。
- OPEN文で、ASYNCHRONOUS='YES' で指定された外部ファイルは、非同期I/Oが使用できます。
- 非同期 I/O 処理は、READ/WRITE文で ASYNCHRONOUS='YES'を指定することで可能です。
- コンパイラは、ASYNCHRONOUS 属性あるいは、ASYNCHRONOUS 文を実装していません。
- Fortran 2003 Stream Input/Output :Fortran 2003 Stream access I/Oは実装されております。
新しいRuntime(ランタイム)ライブラリ・ルーチン
PGI 9.0 は、PGI アクセラレータ・コンパイラのための新たなrun-timeライブラリを導入しました。詳細は、後述します。
新しい環境変数)
PPGI 9.0 は、PGI アクセラレータ・コンパイラのための新たな環境変数を導入しました。詳細は、後述します。
PGI Toolsの変更点(新機能、修正機能)
このセクションで述べる、新しい機能については、PGI Tools Guideに詳細に述べられています。
■ PGDBG
PGDBGは、グラフィカルな MPI/OpenMP/マルチスレッドシンボリックデバッガです。このリリースにおいての強化された機能は、以下の通りです。
- 全て新しいGUI に変更されました
- 直感的ナビゲーションと使用法
- 以前のGUIであった複数のメニューバーから、単一の分かりやすいメニューバーに変更されました。
- source/assembly/mixed の三種のデバッギング・ビュー画面の切り替えを容易く迅速に行うために、タブで切り替えるように変更しました。また、複数のスレッド/プロセスに対するコンテキストのデバッギングやマルチスレッド・マルチプロセスの状態を見やすく配置しました。
- C/C++ include files、 Fortran、INCLUDE processing、並びに Fortran MODULEに対するDWARF(デバッグ情報)の生成を向上させました。
■ PGPROF
PGPROFは、グラフィカルな MPI/OpenMP/マルチスレッド用性能解析、チューニング・プロファイラです。このリリースにおいての強化された機能は、以下の通りです。
- pgcollectユーティリティを使用した新しいデータ集約メカニズムを採用することにより、再コンパイルなしでのプロファイリングや、特別のソフト権限無しでのプロファイリングが可能となりました。また、PGIソフトウェアだけ使用したtime-baseのサンプリングを行った場合、pgcollectを単独使用モードで使用できます。これは、LinuxとMac
OS X 10.5(Leopard) のみで可能です。
- Linux上では、共有オブジェクト・ファイルの中のコードのプロファイルをサポートします。Mac OS X上では、まだ、ダイナミック・ライブラリはサポートされておりません。
- 複数のソースファイルへ「タブ」にてアクセスするためのGUIを更新しました。アセンブリコードへのドリル・ダウン(下位=アセンブラに移動する)が向上しました。
- PGIコンパイラ以外によってコンパイルされたバイナリのプロファイルをサポートしました。
新しい MPI サポート
PGI 7.1より前のバージョンでは、MPI のサポートは、PGI CDK 製品のみとしていましたが、PGI 7.1 のリリース以降、MPICH1
が PGI Workstation/Server ライセンス(Linux版)にバンドルされました。ただし、この PGI Workstation/Serverライセンスでは、その
MPI プログラムの PGDBG デバッギング並びに PGPROF プロファイル機能は、ローカルなシステム上でかつ制限されたプロセス数(現在8プロセス)の範囲内での使用に限定されております。
このPGI Workstation 9.0-1 リリースでは、MPIのサポートを拡張しました。
このリリースでは、ローカルな MPI 使用機能の中に、MPICH-1 だけではなく、HP-MPI for Linux、 MPICH-2、MVAPICH あるいは、OpenMPI のデバッギングとプロファイル機能を使用できるように利用拡張しました。なお、MPI ライブラリは、MPICH-1(Linux版)、OpenMPI
(Mac OX X版) のみバンドルされております。他の MPIライブラリは、任意にインストールしていただく必要があります。Microsoft
社の MSMPI はシステムに別途インストールすることにより、MSMPI 用のデバッグ、プロファイルが Windows 版で可能となります。
なお、MPI の使用方法については、PGI User's Guide の6章 Using MPI の項目をご参照ください。また、openMPI
を使用した場合のプロファイリングの方法に関しては、PGI(r) Server 9.0/PGI(r) Workstation 9.0 Release
Notes の3.11セクションに詳細に説明されておりますのでご参照下さい。
なお、MPIの使用方法については、PGI User's Guide の6章 Using MPI の項目をご参照ください。
※ PGI MPI プログラム開発用コンパイル・オプション、ツールの使用方法のページをこちらです。
ライブラリ・インタフェース
PGI は、Fortran モジュールを使用することによってCインタフェースをエキスポートするライブラリへのアクセスを提供します。これらのライブラリと関数は、PGI
User's Guide の8章の述べられております。
PGI Workstation 9.0
この章では、Linux、 Windows、 and Mac OS Xの各 OS に関わる PGI Workstation/Server のアップデート並びに変更について述べています。
●PGI Workstation 9.0 for Linux
Java Runtime Environment (JRE)
Linux 上でのPGIのインストールでは、32ビットバージョンのJREを含みますが、十分な32ビット X Window をサポートサポートするためには、適正な関数等が有効である必要があります。
いくつかのシステムでは、たとえば、最近の Fedora Core では、これらの関数の一部が標準のインストールにおいて行われないようになりました。X
Window は、一般的には、以下のライブラリをサポートします。
libXau libXdmcp libxcb
libX11 libXext
●PGI Workstation 9.0 for Windows
PGI Workstation 9.0 for Windows は、linux86 (32ビット)並びに linux86-64 (64ビット)環境と同様なほとんどの機能をサポートします。
新しいライセンス取得方法の提供(Windows版のみ)
PGI Workstation 9.0 for Windows のインストールにおいて、インストール時に www.pgroup.com から自動ライセンスファイル生成手続きができるようになりました。
●PGI Workstation 9.0 for Mac OS X
PGI Workstation 9.0 for Mac OS X は、linux86 (32ビット)並びにlinux86-64 (64ビット)環境と同様なほとんどの機能をサポートします。このリリースノートあるいはユーザマニュアルで指摘していること以外は、基本的に
Linux版の機能と同一です。
PGI アクセラレータ・コンパイラ機能 (NVIDIA GPGPUサポート)
「アクセラレータ」とは、特別の目的でCPUにアタッチして使用する協調プロセッサであり、時間の掛かる計算部分をCPU の演算機構からデータと実行部分のカーネルをオフロードするために使用されます。この章では、新しい
PGI アクセラレータ・コンパイラについて説明します。この内容には、ホスト CPU からアタッチされているアクセラレータへオフロード可能な Fortran、C におけるコードの領域
(region) を指定するために使われるディレクティブに関する事項も含みます。
PGI アクセラレータ、プログラミングモデル、ディレクティブに関する詳細な情報は、PGI User's Guide における18章「PGI
Accelerator Compilers Reference」をご参照下さい。
■ コンポーネント
PGI アクセラレータ・コンパイラのテクノロジーは、次のコンポーネントを含みます。
- PGF95自動並列化アクセラレータ付きFortran 90/95コンパイラ
- PGCC自動並列化アクセラレータ付きANSI C99 and K&R Cコンパイラ
- システムが適切なGPUあるいは、アクセラレータカードを有するかどうかを検出するための単純なコマンドライン・ツール
なお、アクセラレータ対応のデバッガあるいはプロファイラは、このリリースでは含まれておりません。
■ 可用性
PGI Fortran & Cアクセラレータ・コンパイラは、64ビットLinuxシステム上のx64プロセッサベースのワークステーションやサーバでのみ使用できます。もちろん、このシステム上にはNVIDIA
CUDA-enable GPUあるいは、TESLAカードが実装されている必要があります。これらのコンパイラは、x64+GPUプラットフォームのタイプでのみ有効です。この章で含まれている全ての例は、このようなプラットフォーム上で開発し、示しているものです。
■ ユーザ指示のアクセラレータ・プログラミング
ユーザが指示するタイプのアクセラレータ・プログラミングにおいては、ユーザはアクセラレータ・デバイスへオフロードするために、その対象とすべきホスト・プログラムの領域を指定します。また、ターゲットとなるアクセラレータでサポートされていないコンストラクトを含む領域やユーザ・プログラムの大半は、ホスト上で実行されます。
■ カバーしていない、あるいは実装していない機能
現在、PGIアクセラレータ・コンパイラは、コンパイラや他のツール等による、アクセラレータにオフロード化できるコード領域の検出やそのオフロード化のための機能は含んでおりません。また、アクセラレータ領域をシングルホスト上にアタッチされている複数のアクセラレータ上で実行できるような機能もカバーしておりません。PGIコンパイラの将来のバージョンでは、自動的なオフロード化や同一ホスト上のマルチ・アクセラレータの使用、あるいは、異なるタイプのマルチ・アクセラレータの使用もできるように計画していますが、現在のバージョンでは、これらはサポートされておりません。
■ 必要とされるシステム仕様
PGI アクセラレータの機能を使用するためには、64ビットLinuxシステム上でNVIDIAドライバーコンポーネントをインストールしておく必要があります。
- NVIDIA Driver
- CUDA Toolkit
- CUDA SDK
これらは、NVIDIA の Webサイト( www.nvidia.com/cuda/) からダウンロード可能です。これらは、PGIコンポーネントではありませんので、NVIDIA 社によってライセンス並びにサポートされます。
さらに、最新の PGI リリースとCUDAソフトウェア、ドライバーの両方をサポートする64ビット Linux システムが必要とされます。
■ サポートするプロセッサとGPU
今回の PGI アクセラレータ・コンパイラのリリースは、PGI コンパイラ&ツールの9.0リリースがサポートする全てのAMD64 並びに Intel
64 のホストプロセッサ上で利用できます。また、コンパイラのオプション・フラグである -tp <target> フラグを使用することもできます。
NVIDIA GPU を対象としたアクセラレータのディレクティブの認識を有効にするための -ta=nvidia フラグも使用できます。そして、CUDA-enableなGeForce、Quadro、Tesla
カードを有した CUDA がインストールされた任意のシステム上で、生成されたコードを使用することができます。
アクセラレータのテクノロジーに関するこれらのフラグの詳細な情報は、PGI User's Guide をご参照下さい。また、サポートされるGPUの詳細なリストは、NVIDIA
のウェブサイトでご覧下さい。www.nvidia.com/object/cuda_learn_products.html
■ インストールとライセンシング
PGI アクセラレータ・コンパイラは、標準的な PGI Workstation、Server、CDK のライセンスキーの他に、別のライセンスキーが必要となります。PGI
9.0 のリリースにおいては、「PGI アクセラレータ・コンパイラ」は、正式なライセンス製品の前の段階の「無償のテクニカル・プレビューという扱い」とし、PGI
9.0 リリースを利用する権利を有する(サブスクリプション有効の)お客様は、2009年12月31日まで本機能を使用することができます(PGI
9.0用のライセンスキーの中に、テクニカル・プレビュー用の使用ライセンスが組み込まれております)。現在、PGI コンパイラ・ライセンスのサブスクリプションの有効期間が過ぎてしまっている場合は、サブスクリプションの有効化を行うか、あるいは、新規のライセンスのご購入が必要となります。
なお、2009年末に、PGI アクセラレータ・コンパイラは、別のコンパイラ・エディション製品として発売する予定ですので、引き続きアクセラレータ機能を使用したいお客様は、製品のアップグレードを行っていただく必要があります。
インストールの方法に関しては、「PGI Workstation Installation Guide」をご参照下さい。
■ アクセラレータ・プログラムの実行
アクセラレータのディレクティブを有し、-ta=nvidia フラグを使ってコンパイル・リンクしたプログラムを実行させる方法は、-ta=nvidia
フラグを付けないでコンパイル・リンクした場合と同じである。プログラムは CUDA ライブラリを探し、動的にロードします。もし、ライブラリがない場合、あるいは、プログラムをコンパイルした際に存在した場所とは異なるディレクトリ上にある場合は、LD_LIBRARY_PATH
環境変数に CUDA ライブラリの所在を追加する必要があります。
プログラムが最初のアクセラレータ領域に到達した際、約0.5~1.5秒ほどのポーズ時間が存在します。これは、GPUへの操作権を得て、静的なリソースを割り付けるための時間オーバーヘッドです。この後は、引き続きオーバーヘッドなしに、アクセラレータ領域を実行することができます。
アクセラレータ・プログラムを CUDA-enable の NVIDIA GPUを有しないシステムで動作させた場合、あるいは、ランタイム・ライブラリの検索範囲のディレクトリの場所に
CUDA ライブラリが存在しない場合、プログラムは、その実行時にエラーメッセージ無しに終了してしまします。
環境変数ACC_NOTIFY にゼロ以外の整数をセットした場合、ランタイム・ライブラリは GPU のカーネル(kernel) が開始される度に、その事実を標準エラーにプリントします。
■ PGI アクセラレータ・コンパイラのランタイム・ライブラリ
PGI アクセラレータ・コンパイラは、アクセラレータの機能に関する問い合わせや実行時にアクセラレータ用のプログラムの挙動を制御するような、ユーザによる呼び出し可能な関数やライブラリ・ルーチンを提供します。Fortran
において、PGI アクセラレータ・コンパイラのランタイム・ルーチンは、PURE あるいは ELEMENTA L手続きからコールされない。
アクセラレータ・ライブラリにアクセスするためには、-ta フラグ(コンパイル・オプション)と共にアクセラレータ・プログラムをリンクする必要があります。
C と Fortran では、各々、別のランタイム・ライブラリが存在します。
- C ランタイム・ライブラリ・ファイル : Cでは、ランタイム・ライブラリ・ルーチンのプロトタイプが "accel.h"と言う名前のヘッダーファイルで用意されています。全てのランタイム・ライブラリ・ルーチンは、"C"リンケージを有する外部関数です。このファイルは、以下を定義します。
1. このセクションの述べられている全てのルーチンのプロトタイプ
2. アクセラレータの型を記述するenumulation型を含むこれらのプロトタイプで使用されている任意のデータ型
- Fortranランタイム・ライブラリ・ファイル : Fortranでは、interfaceの宣言は、accel_lib.hと言う名前のFortranインクルード・ファイルの中、あるいは、accel_libと言うFortranモジュールの中で提供されます。これらのファイルでは、以下を定義します。
1. このセクションの述べられている全てのルーチンのインタフェース
2. これらのルーチンへの引数のための整数kind値を定義するための整数パラメータ
3. アクセラレータの型を記述するための整数パラメータ。
yyyymm と言う値を持った整数パラメータ accel_version は、サポートしているアクセラレータ・プログラミングモデルのバージョンを示すもので、yyyy
は年、mm は月を意味します。この値は、プリプロセッサ変数 _ACCEL の値に合致します。
次のリストは、PGIが現時点でサポートしているPGIアクセラレータ・コンパイラのランタイム・ライブラリを簡単に述べたものです。これらのルーチンの完全な説明は、PGI
User's GuideのPGI Accelerator Runtime Routinesの章をご覧下さい。
- acc_get_device : 使用中のアクセラレータ・デバイスのタイプを返す。
- acc_get_num_devices :ホスト側にアタッチしているアクセラレータ・デバイスの数を返す。
- acc_init :アクセラレータ・デバイスに接続し、初期化を行い、アクセラレータ・ライブラリの中の制御構造を割り付ける。
- acc_set_device_num :アクセラレータの領域を実行するときに使用されるデバイス伝えるルーチン。
■ 環境変数
PGIは、アクセラレータ領域の挙動を修正するための環境変数を提供します。 このセクションでは、実行時のアクセラレータを使用するプログラムの挙動を制御するために使用する、ユーザが指定可能な環境変数について説明します。これらの環境変数は、以下のルールに準拠する必要があります。
- 環境変数の名前は、大文字でなければなりません。
- 環境変数にセットする値は、大文字・小文字の区別はありません。また、最初と最後の余白指定も可能です。
- もし、プログラムが開始した後で、環境変数の値が変更された場合、その挙動は実装依存です。また、例えプログラム自身が値を変えたとしてもこれは同様です。
次のリストは、PGIが現時点でサポートしているPGIアクセラレータ環境変数を簡単に述べたものです。これらのルーチンの完全な説明は、PGI User's
GuideのPGI Accelerator Runtime Routinesの章をご覧下さい。
- ACC_DEVICE:アクセラレータのためのPGI Unified Binaryを実行する時に使用するアクセラレータのデフォルト・デバイスを制御する。NVIDIA
GPU上で実装する場合は、この環境変数は NVIDIAにセットしなければならない。それ以外の場合は、これは HOSTとなる。
- ACC_DEVICE_NUM:アクセラレータ領域を実行する際に使用するデフォルトのデバイス番号を制御する。この値は、負ではない整数で0からホストにアタッチしているデバイスの数までの値となる。
- ACC_NOTIFY:負ではない整数値をセットしたとき、デバイス上のカーネル(kernel) が開始される度に、その事実を標準エラーにプリントします。
■ コンパイラ・コマンド・オプション
アクセラレータを動作させるために特に使用するコマンド・オプションは以下の通りです。
- -tp : 対象となるホストプロセッサのアーキテクチャを指定するオプション
- -Minfo or -Minfo=accel : このオプションを指定すると、コンパイラがアクセラレータ領域をGPUカーネルに翻訳できたかどうかについて、コンパイラのメッセージとして出力します。
- -ta=nvidia(,nvidia_suboptions), host : PGI アクセラレータ・コンパイラに伴う新しいオプションです。-ta は、ターゲット・アーキテクチャを意味します。Fortranにおける
!$ACC ディレクティブ、C における #pragma acc ディレクティブをコンパイラに認識させるために、このオプションを使用します。これは、Fortran
並びに C コンパイラのみで有効です。このオプションは、以下のサブオプションを有します。
* nvidia - NVIDIAアクセラレータをターゲットとして選択します。さらに、以下の nvidia 用のサブオプションがあります。
analysis :ループの解析のみ行い、コードの生成を行いません。
- cc10 :compute capability 1.0 のコードを生成
- cc11 :compute capability 1.1 のコードを生成
- cc13 :compute capability 1.3 のコードを生成
- nofma :fused-multiply-add命令を生成しない
- time:アクセラレータ領域の単純な時間情報を集積するためにプロファイル・ライブラリをリンクする
* host - アクセラレータがターゲットとして存在しないコード生成を行う。アクセラレータ領域をホスト側で実行するようにコンパイルする。PGI Unified
Binaryコードを生成します。
コンパイラは、自動的に必要とする CUDA ソフトウェアのツールを発動し、GPU カーネルコードを生成し、Linux オブジェクト・ファイルの中にカーネルを埋め込みます。
コマンドライン上でリンク時に、アクセラレータのライブラリにアクセスするためには、必ず、-ta フラグ・オプションを指定することが必要です。
■ アクセラレータ用のPGI Unified Binary
PGI ンパイラは、異なるホストプロセッサ用に最適化がなされた関数を備え、一つの実行モジュール形態として実行モジュールを生成するための機能である
PGI Unified Binary をサポートします。このリリースは、PGI Unified Binary をアクセラレータ用まで拡張します。特に、以下のような関数の二つのバージョンを含む単一バイナリを生成できます。
- 一つは、アクセラレータ用に最適化したバージョン
- 他は、アクセラレータが有効ではないとき、あるいは、アクセラレータ上での実行とホスト上での実行を比較したいときに、ホストプロセッサ上で実行するバージョン
- この機能を有効にするには、拡張された-taフラグ・オプション-ta=nvidia,hostを使用します。このフラグは、コンパイラに対して、有効なアクセラレータ領域を有する、以下のような二つのバージョンの関数を生成するように指示する。
- アクセラレータを対象としたコンパイル・バージョン
- アクセラレータ・ディレクティブを無視し、ホストプロセッサを対象としたコンパイル・バージョン
-Minfo フラグをコンパイル時に指定したときは、以下のコンパイル・メッセージと同じようなメッセージを得るでしょう。
s1: (ホスト上の executableバージョン)
12, PGI Unified Binary version for -tp=barcelona-64 -ta=host
18, Generated an alternate loop for the inner loop
Generated vector sse code for inner loop
Generated 1 prefetch instructions for this loop
s1:(nvidia上の executableバージョン)
12, PGI Unified Binary version for -tp=barcelona-64 -ta=nvidia
15, Generating copy(b(:,2:90))
Generating copyin(a(:,2:90))
16, Loop is parallelizable
18, Loop is parallelizable
Parallelization requires privatization of array t(2:90)
Accelerator kernel generated
16, !$acc do parallel
18, !$acc do parallel, vector(256)
Using register for t
上記では、PGI Unified Binaryのメッセージが、サブルーチン s1に関して、二つのバージョンを生成したことを示しています。
- 一つは、アクセラレータのないバージョン(-ta=host)
- もう一方は、NVIDIA GPUのためのバージョン(-ta=nvidia)
実行時に、プログラムは NVIDIA CUDA 動的ライブラリをロードしようとします。そして、GPU の存在を確かめます。もし、ライブラリが有効でないか、あるいは、GPU
が見つからない場合、プログラムはホストバージョンで実行されます。
また、NVIDIA GPU 上で実行するようにプログラムに指示するために、環境変数をセットすることができます。これを行うためには、ACC_DEVICE
を NVIDIA あるいは nvidia セットします。一方、この環境変数にこれ以外の任意の値をセットすると、ホストバージョンを使うようになります。
なお、今回のリリースにおける -ta ターゲットは、"nvidia" と"host" の二つに限られます。
■ 複数のプロセッサターゲット
-ta フラグと共に、複数のプロセッサターゲットを指定する形で、-tp フラグ・オプションも使用できます。この場合、次に述べるような挙動となります。
- 一つの -tp ターゲット値の指定と、一つの -ta 値を指定した場合
その指定された「プロセッサターゲット」と「アクセラレータターゲット」向けに生成された各サブプログラムを有する「一つの実行モジュール・バージョン」が生成される。
- 一つの -tp ターゲット値の指定と、複数の -ta ターゲット値を指定した場合
コンパイラは、その指定された「プロセッサターゲット」と各々の「アクセラレータターゲット」向けのアクセラレータ領域を含むサブプログラムを有する「二つの実行モジュール・バージョン」が生成される。
- 複数の -tp ターゲット値の指定と、一つの -ta の指定をした場合
二つあるいはそれ以上の「プロセッサターゲット」向けのそれぞれのサブプログラムのバージョンを一つの実行モジュール内に生成する。また、その各バージョンは、選択したアクセラレータ用のバイナリコードを含む。
- 複数の -tp ターゲット値の指定と、複数の -ta ターゲット値を指定した場合
例えば、N個の -tp の値と二つの -ta ターゲット値を指定すると、コンパイラは、N+1個のサブプログラムのバージョンを生成する。それは、始めに各
-tp ターゲット用にN個のバージョンを-ta=hostの指定と等価なアクセラレータ領域を無視したバイナリで生成します。そしてさらに、アクセラレータ向けの一つのバージョンを生成します。
■ アクセラレータ・カーネルのプロファイリング
今回のリリースでは、以下のコマンドライン・オプションをサポートします。
-ta=nvidia,time
Timeサブオプションは、タイマーライブラリをリンクします。このサブオプションは、アクセラレータ領域と生成されたカーネルに関するタイミング情報を集積し、印字します。
Sample Accelerator Kernel Timing Data
Accelerator Kernel Timing data
/proj/qa/tests/accel/bb04.f90
s1
15: region entered 1 times
time(us): total=1490738
init=1489138 region=1600
kernels=155 data=1445
w/o init: total=1600 max=1600
min=1600 avg=1600
18: kernel launched 1 times
time(us): total=155 max=155 min=155 avg=155
上記の例において、いくつかの事象を見て取れます。
- 各アクセラレータ領域において、ファイル名 /proj/qa/tests/accel/bb04.f90 とサブルーチンあるいは関数名 s1 とそのアクセラレータ領域の行番号が印字されています。上記例では、15行目という風に。
- ライブラリは何回、領域に入ったかをカウントしています(上記例では、1)。そして、その領域内で諸比した時間をマイクロ秒単位で表示します(上記例では、1490738)。この内訳は、初期化に係わる時間(例では、1489138)と実行時間(例では、1600)の二つに分けて表示します。
- 実行時間は、「カーネル実行時間」と「ホストとGPU間のデータ転送時間」に分離して表示されます。
- 各カーネルは、行番号が表示されます(上記例では18)。カーネルの開始数に沿って、カーネルで消費したtotal、max、min、平均の各時間が表示されます。この例では、1
回のカーネル実行ですので、全て155 です。
■ サポートする組込関数
PGIアクセラレータ・コンパイラは、FortranとCのく見込み関数、サブプログラムをサポートします。PGI組込関数に関する詳細な情報は、PGI
User's Guide における7章「Using an Accelerator」の「Supported Intrinsics」をご参照下さい。さらに、組込関数については、今後のリリースで追加される予定です。
配布と配置
ここでは、コンパイラを使用する上で、関連するトピックスについて述べます。特に、PGI Unified Binary 技術を通しての最適化や、Windows
上のリンクオプションについて、
さらに、siterc ファイルあるいは rc ファイルによるコンパイラのカスタマイズについて説明します。
- PGI Unified Binaries の生成、そのコマンドラインのスイッチ、ディレクティブ、プラグマに関しては、PGI User's Guide
の9 章の Distributing Files - Deployment にて詳しく説明しております。
- スタティックリンクやダイナミックリンクを選択する際のコンパイラ・オプションの使用例やスタティック、ダイナミック・リンク・ライブラリの生成、使用法等に関する詳細は、PGI
User's Guide の8章の Creating and Using Libraries に説明しております。
- 特別の用途で、コンパイラの初期設定ファイルである、Siterc ファイルやユーザ rc ファイルをカスタマイズする方法は、PGI User's
Guide の1章の Examples of Using siterc and User rc Files を参照してください。
アプリケーションの配置と再配布
PGI コンパイラで構築されたプログラムは、ランタイム・ライブラリ・ファイルを必要とする場合があります。PGI コンパイラがインストールされていないシステム上でこのようなプログラムを実行するような場合は、プログラムと共にランタイム・ライブラリ・ファイルも配布する必要があります。このために、全ての
OS プラットフォーム用の再配布用ファイルを提供しています。Windows 版では、PGI は、Microsoft(R) の再配布ファイルも提供しています。
PGI 再配布用ランタイム・ライブラリ
PGI 9.0 リリースでは、ランタイム・ライブラリを含むディレクトリは以下のとおりです。
- $PGI/linux86/98.0/REDIST
- $PGI/linux86-64/9.0/REDIST
- $PGI/win64/9.0/REDIST
- $PGI/win32/9.0/REDIST
これらのディレクトリには、PGI End-user License Agreement(EULA) の条項に基づいた PGI ライセンス契約によって再配布可能なPGI
Linux ランタイム・ライブラリの共有オブジェクトファイル、あるいは、Windo wsダイナミック・リンク・ライブラリ(DLL) が含まれます。
Linux REDIST ディレクトリに中には、サポートする全ての(CPU)ターゲット用の PGI ランタイム・ラブラリの共有オブジェクトファイルが含まれています。これによって、PGIがサポートしている、ほとんどの
Linux システム上で実行することが可能な実行モジュールと PGI ランタイム・ライブラリのパッケージを作成することが可能となります。但し、このために必要な事項は、以下のとおりです。
- 実行モジュールを実行するエンドユーザは、ランタイム・ライブラリの場所(パス)の設定等、そのための適切な環境を構築しておくこと
- Linuxにおいては、PGI共有オブジェクトの検索場所を指定するためにLD_LIBRARY_PATH環境変数をセットすること。
Microsoft(R) 再配布用ランタイム・ライブラリ
Windows上のPGI製品は、Microsoft Open Tools を含みます。Microsoft Open Toolsのディレクトリには、"redist"と言うサブ・ディレクトリが存在します。PGI
9.0 ライセンシーは、PGI End-user License Agreementに準拠し、このディレクトリ内のファイルを再配布することができます。
|