/opt/nec/ve/bin/nld: warning: libbar.so, needed by ./libfoo.so, not found
(try using -rpath or -rpath-link)
./libfoo.so: undefined reference to `bar'
nldの元となるGNU Linkerの仕様となります。nldはLinux/x86_64上で、SX-Aurora TSUBASAのオブジェクトをリンクするため、Cross linkerの動作となります。Cross linker動作時は実際に実行する環境と同じとは限らないため、nldは-rpathオプションや共有ライブラリ内に設定されているRPATHを無視する仕様になっています。-Wl,-rpath-link,ライブラリのパス を指定してください。
プログラムの実行に関するトラブルシューティング
-
実行時に“Node 'N' is Offline”というエラーが発生する。
ノード番号NのVEがOFFLINE状態になっています。VEをONLINE状態にしてください。以下は0番のVEをONLINE状態にするときの例です。
# /opt/nec/ve/bin/vecmd -N 0 state set on
...
Result: Success
# /opt/nec/ve/bin/vecmd state get
...
----------------------------------------------------------------
VE0 [03:00.0] [ ONLINE ] Last Modif:2017/11/29 10:18:00
----------------------------------------------------------------
Result: Success
-
実行時に使用されているノードを確認したい。
/opt/nec/ve/bin/psを実行してください。psコマンドを実行するとVEのノードごとに現在実行されているプロセスのスナップショットを出力します。以下の例では、2番のVEノードでa.outというプログラムが実行中であることが確認できます。
/opt/nec/ve/bin/ps -a
VE Node: 3
PID TTY TIME CMD
VE Node: 1
PID TTY TIME CMD
VE Node: 2
PID TTY TIME CMD
50727 pts/1 00:01:36 a.out
VE Node: 0
PID TTY TIME CMD
-
実行時に”./a.out: error while loading shared libraries: libncc.so.2: cannot open shared object file: No such file or directory”というエラーが出力される。
実行環境にパッケージnec-nc++-shared、nec-nc++-shared-instをインストールしてください。手順は「インストレーションガイド」を参照してください。
-
実行時にダイナミックリンクライブラリが見つからないというエラーが発生する。
共有ライブラリを配置しているディレクトリを環境変数VE_LD_LIBRARY_PATHに設定してください。環境変数VE_LD_LIBRARY_PATHについては「C/C++コンパイラ ユーザーズガイド」を参照してください。
-
実行時に”VE mmap failed on INTERP - TEXT: Cannot allocate memory”というエラーが発生する。
VEプログラムのテキストと静的データの大きさの合計が48GBを超えています。VEプログラムのテキスト、静的データのサイズの合計が48GB以下になるように、サイズの大きなデータを動的に確保するなどソースファイルを変更してください。静的データには、グローバル変数、静的変数、初期化された文字列リテラルなどがあります。
以下のコマンドを実行することでシンボルのサイズを降順に確認できますので参考にしてください。
$ /opt/nec/ve/bin/nnm -C --size-sort -r ./a.out
また、各セクションのサイズは以下のコマンドで確認することができます。
$ /opt/nec/ve/bin/nreadelf -e ./a.out
-
例外発生時に例外発生個所がソースファイルの何行目に対応しているか確認したい。
トレースバック情報から調べることができます。手順は「C/C++コンパイラ ユーザーズガイド」を参照してください。
-
例外発生時にトレースバック機能で表示される例外発生個所が正しくない。
HWによる命令の先行制御によってトレースバック機能で出力される例外発生個所が正しく表示されないことがあります。環境変数VE_ADVANCEOFF=YESを設定することで先行制御を無効にできます。先行制御を無効にすることで実行時間が大幅に長くなることがありますのでご注意ください。
$ export VE_ADVANCEOFF=YES
-
未初期化ローカル変数を使用していないか確認したい。
double型の未初期化ローカル変数については-minit-stack=snanを指定してコンパイル、実行し、例外を検出することで確認できることがあります。float型の未初期化ローカル変数について確認するときは、snanの代わりにsnanfをそれぞれ指定します。ローカル変数がdouble、float型でないとき、この方法で確認することはできません。
-
未初期化ローカル変数の不定値を参照して、プログラムが異常終了するのを回避したい。
-minit-stack=zeroを指定してコンパイル、実行してください。未初期化の領域をゼロクリアすることで異常終了を回避できることがあります。潜在的な問題を解決するためにもプログラムの修正を推奨します。
-
自動並列化、OpenMP機能を使用したプログラムを実行したとき、"Unable to grow stack"、または、SIGSEGVでプログラムが異常終了する。
スタックの使用量が上限を超えている可能性があります。環境変数OMP_STACKSIZEによって各スレッドが使用するスタックサイズの上限を拡張することができます。
$ export OMP_STACKSIZE=2G
-
プログラムが実行時に何スレッドで動作したかを確認したい。
PROGINFのMax Active Threadsを参照してください。Max Active Threadsは環境変数VE_PROGINFにDETAILが設定されているとき、プログラムの実行終了時に標準エラー出力に出力されます。詳細は「PROGINF/FTRACE ユーザーズガイド」を参照してください。
以下の例では、Max Active Threadsが4であるため、4スレッドで動作したことが確認できます。
******** Program Information ********
(...)
Power Throttling (sec) : 0.000000
Thermal Throttling (sec) : 0.000000
Max Active Threads : 4
Available CPU Cores : 8
Average CPU Cores Used : 3.323850
Memory Size Used (MB) : 7884.000000
Start Time (date) : Mon Feb 19 04:43:34 2018 JST
End Time (date) : Mon Feb 19 04:44:08 2018 JST
-
自動並列化、OpenMP機能を使用したプログラムを実行したとき、スレッドがいつ生成、解放されるのか知りたい。
既定の動作では、環境変数OMP_NUM_THREADS、または、VE_OMP_NUM_THREADSによりスレッド数が指定されたときその個数、そうでないときプログラムで利用可能なVEコア数と同じ個数のスレッドが、プログラムの実行開始前に生成され、終了時に解放されます。
-
自動並列化、OpenMP機能を使用したプログラムを実行したとき、実行時のスレッド数がどのように決まるのか知りたい。
実行時のスレッド数は、環境変数OMP_NUM_THREADSやVE_OMP_NUM_THREADS、OpenMPのnum_threads句、omp_set_num_threads関数で指定することができます。優先順位は以下のとおりです。
- OpenMPのnum_threads句で指定した値
- 関数omp_set_num_threads()で指定した値
- 環境変数VE_OMP_NUM_THREADSで指定した値
- 環境変数OMP_NUM_THREADSで指定した値
- 利用可能なVEコア数と同じ値
num_threads句、omp_set_num_threads()、VE_OMP_NUM_THREADS、または、OMP_NUM_THREADSに利用可能なVEコア数より大きな値を指定したとき、実行時のスレッド数は利用可能なVEコア数と同じ値になります。
-
ベクトル化するとバスエラーが発生する。
4バイトアラインされた配列を8バイト要素のベクトル命令でロード/ストアしている可能性があります。
以下の例では、引数で渡されたfloat型(4バイトアライン)の配列a、bがuint64_t型にキャストされているため、8バイト要素のベクトル命令でロード/ストアされます。
void func1(){
float a[511],c[511];
(...)
func2(a,b);
}
void func2( void* a, void* b ){
for(int i=255; i>0; --i){ //!!! vectorized loop
((uint64_t*)b)[i] = ((uint64_t*)a)[i];
}
}
次のように配列を8バイトアラインするか、novector指示行でベクトル化を抑止してください。
float a[511] __attribute__((aligned(8)));
float b[511] __attribute__((aligned(8)));
-
プログラムの実行において、必要なスタックサイズを確認したい。
必要なスタックサイズは実行してみないとわからないため調べる方法はありません。
プログラムのチューニングに関するトラブルシューティング
-
プログラムにどの最適化が適用されたかを確認したい。
コンパイル時に出力される診断メッセージ、および、編集リストを参照してください。診断メッセージリストは-report-diagnostics、編集リストは-report-formatを指定したとき出力されます。
詳細は、「C/C++コンパイラ ユーザーズガイド」を参照してください。
-
ベクトル化を促進したにもかかわらず、性能が低下する。
ベクトル化対象のループの繰り返し数が少ない場合、ベクトル化のためのオーバーヘッドにより性能が低下する場合があります。このようなループはnovector指示行で自動ベクトル化を抑止してください。
-
自動並列化、OpenMP機能を使用したプログラムを実行したとき、PROGINFとFTRACEの同項目で表示される値が異なる。
主プログラムの実行開始前に自動生成されるスレッドのスピンウェイト分の演算数等はPROGINFでは加算されますが、FTRACEでは加算されません。
-
!$omp parallel num_threads(4)を指定して、環境変数OMP_NUM_THREADS=4、OMP_NUM_THREADS=5でそれぞれ実行した場合、OMP_NUM_THREADS=5のほうが並列数が多いにもかかわらず、実行時間が長くなる。
num_threads句で渡される値が、環境変数OMP_NUM_THREADSで指定している値と違う場合には、スレッドの再生成による実行時間の増加が発生します。主プログラムの実行開始前にスレッドが自動生成されます。この時生成されるスレッド数は、環境変数OMP_NUM_THREADSの値で決まります。プログラム中で、OpenMPのomp_set_thread_num()関数やnum_threads句の指定により、スレッド数が変更される場合、実行開始時に自動生成されたスレッドは解放され、新たにスレッドが再生成されます。
-
FTRACEの出力に、名前$1など、'$'の後に数字のあるルーチン名が表示される。これらは何か?
ベクトル化、並列化のためにコンパイラが作成したルーチンです。
インストールに関するトラブルシューティング
-
正しくインストールできているかを確認したい。
--versionを指定し、バージョンを確認します。表示されたバージョン番号がインストールした物件と同じであれば正しくインストールできています。以下のX.X.Xにバージョン番号が表示されます。
$ /opt/nec/ve/bin/ncc --version
ncc (NCC) X.X.X (Build 14:10:47 Apr 23 2020)
Copyright (C) 2018,2020 NEC Corporation.
-
過去のバージョンのコンパイラをインストールしたい。
過去のバージョンのコンパイラのインストール手順は、SX-Aurora TSUBASAインストレーションガイドの「A.1.1 特定バージョンのコンパイラのインストール」を参照してください。
-
過去のバージョンのコンパイラを利用したい。
コンパイル時に /opt/nec/ve/bin/nfort-X.X.X、ncc-X.X.X、または、nc++-X.X.X(X.X.Xはコンパイラのバージョン番号)を起動してください。
-
過去のバージョンのコンパイラをデフォルトにしたい。
次の2つの方法のうちいずれかを実施してください。
-
各バージョンのncc/nc++/nfortコマンドの実体は以下のようにインストールされています。
ここでは、X.X.Xはバージョン番号です。
/opt/nec/ve/ncc/X.X.X/bin/ncc
/opt/nec/ve/ncc/X.X.X/bin/nc++
/opt/nec/ve/nfort/X.X.X/bin/nfort
デフォルトにしたいバージョンのbinディレクトリをコマンドサーチパス(環境変数PATH)に設定してください。
- /opt/nec/ve/bin/ncc(nc++, nfort)のパスで起動されるコンパイラを変更する。
デフォルトにしたいバージョンのパッケージをyumコマンドでインストールします。SX-Aurora TSUBASAインストレーションガイドの「A.1.1 特定バージョンのコンパイラのインストール」-「/opt/nec/ve/bin のコンパイラの変更」を参照してください。
※本手順は/opt/nec/ve/bin/ncc(nc++, nfort)を使用するすべてのユーザに影響する点にご注意ください。