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種類に分類できる.

  • 共通のオプション:各言語に対して共通のオプション
    • コンパイルドライバオプション:コンパイルの一連のプロセスに適応するオプション.
    • プロセスオプション:コンパイルの各プロセス(例えば,プリプロセスやフロントエンド)に対して個別に適応するオプション.
  • 固有のオプション:各言語に対して固有のオプション
_images/flow.png

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の実行コマンドである mpiexecmpirun を用いて実行を行う.ただし, インストール方法 の「XcalableMPにおける他の片側通信ライブラリの利用」の通りにランタイムにGASNetも用いている場合,GASNetの実行コマンド( gasnetrun_XXXXXX は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_SIZEXMP_ONESIDED_STRIDE_SIZE を合計した値が,プログラム開始時に確保される.