3. 利用方法¶
本章では,Omni Compilerを用いたXcalableMP,XcalableACC,OpenACCのコードのコンパイルおよび実行方法について説明する.
3.1. コンパイル方法¶
3.1.1. XcalableMP/C¶
$ xmpcc a.c
3.1.2. XcalableMP/Fortran¶
$ xmpf90 a.f90
3.1.3. XcalableACC/C¶
$ xmpcc -xacc a.c
3.1.4. OpenACC/C¶
$ ompcc -acc a.c
3.2. コンパイルオプションについて¶
Omni Compilerが生成したコードはネイティブコンパイラが最終的にコンパイルする.そのため,後述するOmni Compiler特有のオプション以外は,すべてネイティブコンパイラに渡される.例えば,よく利用される最適化オプション -O2
はそのままネイティブコンパイラに渡される.
$ xmpcc -O2 a.c
3.2.1. Omni Compiler特有のオプション¶
3.2.1.1. オプションの分類¶
Omni Compiler特有のオプションは,共通のオプションと固有のオプションの2種類に分類できる.さらに,共通のオプションは,コンパイルドライバオプションとプロセスオプションの2種類に分類できる.
- 共通のオプション:各言語に対して共通のオプション
- コンパイルドライバオプション:コンパイルの一連のプロセスに適応するオプション.
- プロセスオプション:コンパイルの各プロセス(例えば,プリプロセスやフロントエンド)に対して個別に適応するオプション.
- 固有のオプション:各言語に対して固有のオプション
3.2.1.2. 共通のオプション¶
- コンパイルドライバオプション
オプション | 意味 |
---|---|
-o <file> | 出力ファイルを指定する |
-I <dir> | インクルードヘッダのあるディレクトリを指定する |
-c | コンパイルとアセンブルのみを行う |
-E | プリプロセスのみを行う |
-v,--verbose | 各プロセスの状態を表示する |
--version | Omni Compilerのバージョンを表示する |
-h,--help | ヘルプを表示する |
--show-env | Omni Compilerで利用している内部変数を表示する |
--tmp | Omni Compilerが変換したファイルを__omni_tmp__<file>に保存する |
--dry | 各プロセスの動作の表示のみを行う |
--debug | 各プロセスが生成するすべての中間ファイルを./__omni_tmp__/に保存する |
--stop-pp | プリプロセスの直後に動作を停止させる |
--stop-frontend | フロントエンドの直後に動作を停止させる |
--stop-translator | トランスレータの直後に動作を停止させる |
--stop-backend | バックエンドの直後に動作を停止させる |
--stop-compile | コンパイルの直後に動作を停止させる |
- プロセスオプション
オプション | 意味 |
---|---|
--Wp[option] | プリプロセスにオプションを追加する |
--Wf[option] | フロントエンドにオプションを追加する |
--Wx[option] | トランスレータにオプションを追加する |
--Wb[option] | バックエンドにオプションを追加する |
--Wn[option] | コンパイルにオプションを追加する |
--Wl[option] | リンカにオプションを追加する |
例えば,リンカのみに -Ltest
というオプションを渡したい場合は,下記のようにする.
$ xmpcc --Wl"-Ltest" a.c
3.2.1.3. 固有のオプション¶
- XcalableMP/C
オプション | 意味 |
---|---|
-omp, --openmp | OpenMP指示文を有効化する |
--profile scalasca | すべての指示文をScalascaの測定範囲にする |
--profile tlog | すべての指示文をtlogの測定範囲にする |
--selective-profile scalasca | profile という節をつけた指示文のみをScalascaの測定範囲にする |
--selective-profile tlog | profile という節をつけた指示文のみをtlogの測定範囲にする |
- XcalableMP/Fortran
オプション | 意味 |
---|---|
-omp, --openmp | OpenMP指示文を有効化する |
-J <dir> | モジュールファイルのあるディレクトリを指定する |
-cpp | プリプロセスを実行する |
-max_assumed_shape=N | 割付け仮配列の最大値を設定する.デフォルトは16 |
- XcalableACC/C
オプション | 意味 |
---|---|
-xacc[=pgi], --xcalableacc[=pgi] | XcalableACC指示文を有効化する. =pgi が付加された場合,バックエンドのOpenACCコンパイラとしてPGIコンパイラが用いられる |
--no-ldg | 読み取り専用のデータキャッシュを無効化する |
--default-veclen=LENGTH | ベクタ長を指定する(デフォルトは256) |
--platform=PLATFORM | プラットフォーム(CUDAもしくはOpenCL)を指定する(デフォルトはCUDA) |
--device=DEVICE | デバイスのアーキテクチャ(Fermi, Kepler, Maxwell, Pascal, Volta, cc??)を指定する(デフォルトはFermi) |
- XcalableACC/Fortran
オプション | 意味 |
---|---|
-xacc[=pgi], --xcalableacc[=pgi] | XcalableACC指示文を有効化する. =pgi が付加された場合,バックエンドのOpenACCコンパイラとしてPGIコンパイラが用いられる |
- OpenACC/C
オプション | 意味 |
---|---|
-acc, --openacc | OpenACC指示文を有効化する |
--no-ldg | 読み取り専用のデータキャッシュを無効化する |
--default-veclen=LENGTH | ベクタ長を指定する(デフォルトは256) |
--platform=PLATFORM | プラットフォーム(CUDAもしくはOpenCL)を指定する(デフォルトはCUDA) |
--device=DEVICE | デバイスのアーキテクチャ(FermiもしくはKepler)を指定する(デフォルトはFermi) |
3.3. 実行方法¶
3.3.1. XcalableMPとXcalableACC¶
XcalableMPとXcalableACCではランタイムにMPIを利用しているため,MPIの実行コマンドである mpiexec
や mpirun
を用いて実行を行う.ただし, インストール方法 の「XcalableMPにおける他の片側通信ライブラリの利用」の通りにランタイムにGASNetも用いている場合,GASNetの実行コマンド( gasnetrun_XXX
. XXX
はconduit名)を用いる.
- GASNetを用いない場合
$ mpiexec -n 2 ./a.out
- GASNetを用いた場合(ibv-conduitの場合)
$ gasnetrun_ibv -n 2 ./a.out
3.3.2. OpenACC¶
$ ./a.out
3.4. 環境変数¶
3.4.1. XMP_NODE_SIZEn¶
XcalableMPの仕様におけるノード集合の定義では最終次元のみ *
を利用できる.
- C言語
#pragma xmp nodes p[*][2]
- Fortran
!$xmp nodes p(2,*)
Omni Compilerはこの仕様を拡張し,最終次元以外においても *
を利用可能にしている.
- C言語
#pragma xmp nodes p[*][*]
- Fortran
!$xmp nodes p(*,*)
プログラム実行時に環境変数 XMP_NODE_SIZEn(nは0から始まる整数)
により各次元のノード数を設定する.例えば,
$ export XMP_NODE_SIZE0=2
$ export XMP_NODE_SIZE1=4
$ mpirun -np 8 ./a.out
は下記と同じ意味である.
- C言語
#pragma xmp nodes p[4][2]
- Fortran
!$xmp nodes p(2,4)
3.4.2. XMP_ONESIDED_HEAP_SIZE(GASNetおよびMPI Version 3利用時のみ)¶
環境変数 XMP_ONESIDED_HEAP_SIZE
は,下記のようなプログラムの実行時エラーが発生した場合に変更する必要がある.
[ERROR] Cannot allocate coarray. Heap memory size of coarray is too small.
Please set the environmental variable "XMP_ONESIDED_HEAP_SIZE"
環境変数 XMP_ONESIDED_HEAP_SIZE
は,omni-compilerのプログラム開始時に確保する片側通信の機能に用いるメモリサイズを指定している.
上記のエラーメッセージは,確保したメモリサイズでは足りないことを意味している.
デフォルトは16MByteである.変更する場合は,下記のように行う.
$ export XMP_ONESIDED_HEAP_SIZE=32M
3.4.3. XMP_ONESIDED_STRIDE_SIZE(GASNet利用時のみ)¶
環境変数 XMP_ONESIDED_STRIDE_SIZE
は,下記のようなプログラムの実行時エラーが発生した場合に変更する必要がある.
[ERROR] Memory size for coarray stride transfer is too small.
Please set the environmental variable "XMP_COARRAY_STRIDE_SIZE"
環境変数 XMP_ONESIDED_STRIDE_SIZE
は,omni-compilerのプログラム開始時に確保するCoarrayのストライド通信(例えば, a(1:N:2) = b(1:N:2)[2]
)に用いるメモリサイズを指定している.上記のエラーメッセージは,確保したメモリサイズでは足りないことを意味している.デフォルトは1MByteである.変更する場合は,下記のように行う.
$ export XMP_ONESIDED_STRIDE_SIZE=2M
なおGASNet利用時は, XMP_ONESIDED_HEAP_SIZE
と XMP_ONESIDED_STRIDE_SIZE
を合計した値が,プログラム開始時に確保される.