2018年2月更新
PGI の F77, F2003, C, C++ のコンパイラを使用する際に、異なる CPU ターゲットでクロスコンパイルを行うためのオプションを説明します。以下では、pgfortran / pgcc を使用した場合の例を示していますが、コンパイラのオプションの設定方法は、C++ 言語コンパイラでも同じです。「クロスコンパイル」と言う意味は、異なるCPUアーキテクチャ、プロセッサ用に最適化された実行バイナリを作ることを言います。PGIのコンパイラのデフォルトの動作は、コンパイラが動作している当該マシン上に搭載されたプロセッサ用に最適化して実行バイナリを作成します。
クロスコンパイル用コマンド・オプション
Intel Skylakeプロセッサ用に最適化してバイナリを作成 $ pgfortran -tp skylake -m64 -fastsse xx.f PGI 14.1 以降は、以下の指定方法を推奨 (target名と -m32(32bit binary) あるいは -m64 (64bit bainary)の二つを指定する) -tp={target名} -m32|-m64 $ pgfortran -tp haswel -m64 -fastsse xx.f (Haswell の 64bit用バイナリ作成) $ pgfortran -tp haswel -m32 -fastsse xx.f (Haswell の 32bit用バイナリ作成) Intel skylakeとAMD Zen プロセッサ用のPGI Unified Binaryを作成 $ pgcc -tp skylake,zen -m64 -fastsse xx.c
-tp オプションにより、-tp にそれぞれの CPU タイプに応じた target 名を記述することにより、クロスコンパイル機能(その CPU に特化した最適化を行ったモジュールを作成する)を使用することができます。この CPU ターゲット名は、以下の表に示します。 -tp の後に各 target を指定し、そのアーキテクチャに沿ったコードを生成します。ターゲットの default は、コンパイルを実行するシステムのプロセッサにそのターゲットが設定されます。そのシステム(プロセッサ)がサポートするプロセッサ・インストラクションを使用してコードが生成されます。
クロスコンパイル用 CPU ターゲット | ||
---|---|---|
target名 | プロセッサの説明 | 備考 |
インテル® プロセッサ用ターゲット | ||
knl | Intel Nights Landing | PGI 18.1 以降 |
skylake | Intel Core i7 (Skylake) | PGI 18.1 以降 |
haswell | Intel Core i7 (Haswell) | PGI 14.1 以降 |
haswell-64 | Intel Core i7 (Haswell) 64-bit mode | PGI 14.1 以降 |
haswell-32 | Intel Core i7 (Haswell) 32-bit mode | PGI 14.1 以降 |
ivybridge | Intel Core i7 (Ivybridge) | PGI 14.1 以降 |
ivybridge-64 | Intel Core i7 (Ivybridge) 64-bit mode | PGI 14.1 以降 |
ivybridge-32 | Intel Core i7 (Ivybridge) 32-bit mode | PGI 14.1 以降 |
sandybridge-64 | Intel Core i7 (Sandybridge) | PGI 11.6 以降 |
sandybridge-64 | Intel Core i7 (Sandybridge) 64-bit mode | PGI 11.6 以降 |
sandybridge-32 | Intel Core i7 (Sandybridge) 32-bit mode | PGI 11.6 以降 |
nehalem | Intel Quad-Core Core i7 (Nehalem) | PGI 9.0-1 以降 |
nehalem-64 | Intel Quad-Core Core i7 (Nehalem) 64-bit mode | PGI 9.0-1 以降 |
nehalem-32 | Intel Quad-Core Core i7 (Nehalem) 32-bit mode | PGI 9.0-1 以降 |
penryn | Intel Quad-Core Penryn | PGI 7.2 以降 |
penryn-64 | Intel Quad-Core Penryn 64-bit mode | PGI 7.2 以降 |
penryn-32 | Intel Quad-Core Penryn 32-bit mode | PGI 7.2 以降 |
core2 | Intel Core 2 | PGI 6.2 以降 |
core2-64 | Intel Core 2 EM64T 64-bit mode | PGI 6.2 以降 |
core2-32 | Intel Core 2 32-bit mode | PGI 6.2 以降 |
p7 | Intel Xeon/Pentium 4 | PGI 5.2 以降 |
p7-64 | Intel Xeon/Pentium 4 64-bit mode | PGI 5.2 以降 |
p7-32 | Intel P7 Xeon/Pentium 4 32-bit mode | |
p6 | Intel P6 Pentium (Pentium Pro, II, III) | |
p5 | Intel Pentium | |
px | Intel generic Pentium | |
AMD プロセッサ用ターゲット | ||
k7 | AMD Athlon Processor | |
k8-32 | AMD Opteron/Athlon64 32-bit mode | PGI 5.0 以降 |
k8-64 | AMD Opteron/Athlon64 AMD64 64-bit mode | PGI 5.0 以降 |
k8-64e | AMD Opteron/Turion/Athlon64 AMD64 64-bit mode プロセッサ・リビジョン E / F 以降(SSE3機構あり) |
PGI 6.1 以降 |
barcelona | AMD Opteron/Quad-Core AMD64 : barcelona | PGI 7.0-3 以降 |
barcelona-32 | AMD Opteron/Quad-Core AMD64 : barcelona 32-bit mode | PGI 7.0-3 以降 |
barcelona-64 | AMD Opteron/Quad-Core AMD64 : barcelona 64-bit mode | PGI 7.0-3 以降 |
shaghai | AMD Opteron/Quad-Core AMD64 : shaghai | PGI 8.0-1 以降 |
shaghai-32 | AMD Opteron/Quad-Core AMD64 : shaghai 32-bit mode | PGI 8.0-1 以降 |
shaghai-64 | AMD Opteron/Quad-Core AMD64 : shaghai 64-bit mode | PGI 8.0-1 以降 |
istanbul | AMD Istanbul (6core) | PGI 9.0-1 以降 |
istanbul-32 | AMD Istanbul (6core) : 32-bit mode | PGI 9.0-1 以降 |
istanbul-64 | AMD Istanbul (6core) : 64-bit mode | PGI 9.0-1 以降 |
bulldozer | AMD Bulldozer e | PGI 11.9 以降 |
bulldozer-32 | AMD Bulldozer : 32-bit mode | PGI 11.9 以降 |
bulldozer-64 | AMD Bulldozer : 64-bit mode | PGI 11.9 以降 |
piledrive | AMD Piledriver | PGI 13.1 以降 |
piledriver-32 | AMD Piledriver : 32-bit mode | PGI 13.1 以降 |
piledriver-64 | AMD Piledriver : 64-bit mode | PGI 13.1 以降 |
zen | AMD Zen : 64-bit mode | PGI 18.1 以降 |
現在の x86 系のプロセッサ(x64とも言う)は、ハードウェア的に全て 64ビット対応となっています。しかし、その上で動作する OS の種別が 32bit OS か 64bit OS かにより、そのシステムが 32bit か 64bit かと言う区別をしております。32bit OS 上では、そこで生成される用実行バイナリは、32ビット用のバイナリのみとなります。一方、64bit OS 上では、デフォルトでは、64ビット実行バイナリが生成されますが、上記のクロスコンパイル機能で、32ビット用の実行バイナリも作成することができます。例えば、64bit OS 上で、-tp nehalem-32 と指定すれば、32ビット用 Nehalem CPU に最適化された実行バイナリが作成されます。クロスコンパイル機能は、こうしたプロセッサやビットモードが異なるシステム上で動作させるための最適バイナリを作成する機能です。さらに、PGI製品は、マイクロアーキテクチャが異なるIntel® 64と AMD64 の各プロセッサ用に最適化したコード・ブロックや GPU 用のコードを全て一つの実行バイナリの中に生成できる「PGI Unified Binary™」と言うユニークな特長を有しています。
特に、AMD 社の AMD64 (Opetron系)とインテル社の Intel(R) 64 (Pentium, Xeon系)は、互換性を有するものですが、各プロセッサのマイクロ・アーキテクチャの違いにより、その最適化方法が異なります。例えば、AMD64 用に生成されたコードは、Intel(R)64マシン上では十分な性能を発揮できません。また、その逆で、Intel(R)64 用に生成されたコードも AMD64 マシン上では性能が大幅に落ちる場合があります。PGI コンパイラは、AMD64 並びに、Intel(R)64 のプロセッサのそれぞれに最適化し、一つの実行バイナリファイルとして生成できる PGI Unified Binary機能を有しています。これは、他社製コンパイラにはない機能となります。PGI コンパイラは、最新のテクノロジーを有するインテル社のプロセッサも、AMD 社のプロセッサにも十分な最適化を行える商用コンパイラです。これを実証した例をこちらでご覧ください。
Multiple PGI Unified Binary Targets(PGI 7.0 以降の新機能)
-tp オプション(スイッチ)は、コンマ(,)で区切られた複数のプロセッサ Target リストを指定する形態をサポートしました。二つ以上の 64-bit ターゲットに対しての PGI Unified Binary としての最適化(例: -tp k8-64e,p7-64,core2-64 と指定すると三つのターゲットに最適化されたコードを生成します)を指示することができます。なお、従来の -tp x64 オプションの場合は、過去のターゲットである -tp k8-64,p7-64 と等価となりますので、現在はほとんど使用しません。
マルチターゲット指定の例
$ pgcc -tp sandybridge-64,shaghai-64,core2-64 -fastsse xx.c
PGI 7.0 において、PGI Unified Binary を生成するように、プログラム・ソース上に指示するためのディレクティブ、プラグマが新設されました。これらは、コンパイラに対して、一つ以上の CPU ターゲット用の Unified Binary 最適化コードを「関数」、「サブルーチン」、「ソース・ファイル全体」に対して生成するように指示することができるものです。ソースプログラム上に、ディレクティブを指示(挿入)した場合は、特別のコマンドライン・オプションは必要ありません。 Fortran ディレクティブの書式は、以下のとおりです。
!pgi$[g|r| ] tp [target]...
ここで、ディレクティブが有効となるスコーピングの範囲は、g(global)、r(routine)、あるいは空白で指示します。デフォルトは、r(routine) 単位となります。例えば、
!pgi$g tp k8_64 p7_64
は、全体のソースファイルに対して(g(global) でスコーピングを指示している)、k8_64 並びに p7_64 用の最適化を施した Unified Binary を生成すると言う意味となります。 C/C++のプラグマの書式は、以下のとおりです。
#pragma routine tp k8_64 p7_64 core2_64
これは、次の function/routine に対して、k8_64、p7_64、core2_64 用の Unified Binary を生成すると言う意味となります。
64ビット Linux 上での32ビット環境のクロスコンパイルに関してのFAQ
Red Hat Enterprise Linuxシステム上でデフォルトの64ビットコンパイル環境を使用している際には問題なく動作するのですが、32ビット用の実行モジュールを生成しようとしてクロスコンパイル(コンパイルオプション -tp p7 あるいは -tp -k8-32)を行うと、32ビットのコンパイル環境が存在しないというメッセージで、コンパイルできない場合があります。 これは、Linux システムに gcc の32 ビットのコンパイル環境 (gcc、gfortran、ライブラリ)が実装されていない状態で、PGI のインストールを行ったことに原因があります。再度、現在の Linux システムにGCC の 32 ビットのコンパイル環境を追加インストールしてから、PGIコンパイラを再インストールしてください。詳細は、こちらのページへ。