ページの先頭です。
ここから本文です。

よくあるご質問(サポートFAQ)

[SX-Aurora TSUBASA] Fortran/C/C++コンパイラ FAQ

質問内容

Fortranコンパイラ

プログラムのコンパイルに関するトラブルシューティング

  1. ”Fatal:License: Unknown host.”というコンパイルエラーが発生する。

  2. “Invalid #line directive” というコンパイルエラーが発生する。

  3. “Cannot find module: ~“というコンパイルエラーが発生する。

  4. “not a valid module information file” というコンパイルエラーが発生する。

  5. 指示行に対して、”Syntax error”というコンパイルエラーが発生する。

  6. ”Invalid input for integer editing”というコンパイルエラーが発生する。

  7. ”Error: Invalid suffix”というアセンブルエラーが発生する。

  8. モジュールファイル、ヘッダファイル、ライブラリを利用するときにコンパイラ、リンカが参照するディレクトリを確認したい。

  9. ”undefined reference to `ftrace_region_begin_' / `ftrace_region_end_'”というリンクエラーが発生する。

  10. ”undefined reference to '__vthr$_barrier'”というリンクエラーが発生する。

  11. ”undefined reference to '__vthr$_pcall_va”というリンクエラーが発生する。

  12. ”cannot find -lveproginf”、および、”cannot find -lveperfcnt”というリンクエラーが発生する。

  13. コードサイズの大きいプログラムをコンパイルしたときにSIGSEGVでアボートする。

  14. コンパイル時にSIGKILLが発生する。

  15. VE向けの実行ファイルであることを確認したい。

  16. VE3向けのオブジェクトファイルであることを確認したい。

  17. 自動並列とOpenMP並列を混ぜてリンクするとき、-fopenmp、-mparallelのどちらを指定すればよいか。

  18. -fcheckを指定すると、コンパイル時間が異常に長くなる。

  19. -fcheckを指定すると、実行時間が異常に長くなる。

  20. -ftraceを指定すると、実行時間が異常に長くなる。

  21. OMP_NUM_THREADSで8より大きい値を指定しても、その数のスレッドが生成されない。

  22. 定義済みマクロの名前、値を知りたい。

  23. Fortranプログラムをプリプロセスしたい。

  24. FortranプログラムとC/C++プログラムのオブジェクトファイルを混在リンクしたい。

  25. SXシリーズで利用していたプログラムのオプションをVector Engine向けに変更したい。

  26. SXシリーズで利用していたプログラムの指示行をVector Engine向けに変更したい。

  27. 診断メッセージに、名前$1など、'$'の後に数字のある変数、ルーチン名が表示される。これらは何か?

  28. 診断メッセージに、変数名ではなくDOUBLE、floatなどの型名のみが表示されることがある。これらは何か?

  29. "Internal error detected -- please report."というメッセージが表示された。

  30. ループ中にALLOCATE文、DEALLOCATE文がないのに次のメッセージが出力される。
    vec(181): Allocation obstructs vectorization.
    vec(182): Deallocation obstructs vectorization.
    

  31. -bssと-saveの違いについて知りたい。

  32. コンパイル時に指定した覚えのないコンパイラオプションが有効になっている。

  33. コンパイラのバージョンを確認したい。

  34. -fpie、-fPIEオプションで位置独立実行形式の実行ファイルを作成したい。

  35. "Too many elements in array"というコンパイルエラーが発生する。

  36. モジュールソースファイルをコンパイルしたとき、.Lファイルが生成されない。

  37. a.out->foo.so->bar.so というように多段の依存関係を含むプログラムをビルドするときに、以下のリンクエラーが発生する。

  38. -mparallelを指定したとき、以下のようなWarningが発生する。

プログラムの実行に関するトラブルシューティング

  1. 実行時に“Node 'N' is Offline”というエラーが発生する。

  2. 実行時に使用されているノードを確認したい。

  3. 実行時に”./a.out: error while loading shared libraries: libnfort.so.2: cannot open shared object file: No such file or directory”というエラーが出力される。

  4. 実行時にダイナミックリンクライブラリが見つからないというエラーが発生する。

  5. 例外発生時に例外発生個所がソースファイルの何行目に対応しているか確認したい。

  6. 例外発生時にトレースバック機能で表示される例外発生個所が正しくない。

  7. 例外発生時にそれまでのバッファに書き込んだデバッグWRITE結果を出力するようにしたい。

  8. 未初期化変数を使用していないか確認したい。

  9. 未初期化変数の不定値を参照して、プログラムが異常終了するのを回避したい。

  10. 自動並列化、OpenMP機能を使用したプログラムを実行したとき、"Unable to grow stack"、または、SIGSEGVでプログラムが異常終了する。

  11. プログラムが実行時に何スレッドで動作したかを確認したい。

  12. 自動並列化、OpenMP機能を使用したプログラムを実行したとき、スレッドがいつ生成、解放されるのか知りたい。

  13. 自動並列化、OpenMP機能を使用したプログラムを実行したとき、実行時のスレッド数がどのように決まるのか知りたい。

  14. プログラムの実行において、必要なスタックサイズを確認したい。

プログラムのチューニングに関するトラブルシューティング

  1. プログラムにどの最適化が適用されたかを確認したい

  2. ベクトル化を促進したにもかかわらず、性能が低下する。

  3. 自動並列化、OpenMP機能を使用したプログラムを実行したとき、PROGINFとFTRACEの同項目で表示される値が異なる。

  4. !$omp parallel num_threads(4)を指定して、環境変数OMP_NUM_THREADS=4、OMP_NUM_THREADS=5でそれぞれ実行した場合、OMP_NUM_THREADS=5のほうが並列数が多いにもかかわらず、実行時間が長くなる。

  5. FTRACEの出力に、名前$1など、'$'の後に数字のあるルーチン名が表示される。これらは何か?

インストールに関するトラブルシューティング

  1. 正しくインストールできているかを確認したい

  2. 過去のバージョンのコンパイラをインストールしたい。

  3. 過去のバージョンのコンパイラを利用したい。

  4. 過去のバージョンのコンパイラをデフォルトにしたい。

旧コンパイラからの移行に関するトラブルシューティング

  1. 数値記憶単位「-ew」を指定している。

  2. 精度拡張「-A dbl」を指定している。

  3. 精度拡張「-A dbl4」を指定している。

  4. 精度拡張「-A dbl8」を指定している。

  5. 精度指定(F_UFMTADJUST=TYPE2)を指定してバイナリ入力している。

  6. SX-ACEで作成したバイナリデータの入力している。

C/C++コンパイラ

プログラムのコンパイルに関するトラブルシューティング

  1. “Fatal: License: Unknown host.” というコンパイルエラーが発生する。

  2. 指示行に対して、”Syntax error”というコンパイルエラーが発生する。

  3. ”Error: Invalid suffix”というアセンブルエラーが発生する。

  4. ヘッダファイル、ライブラリを利用するときにコンパイラ、リンカが参照するディレクトリを確認したい。

  5. ”undefined reference to `ftrace_region_begin' / `ftrace_region_end'”というリンクエラーが発生する。

  6. ”undefined reference to '__vthr$_barrier'”というリンクエラーが発生する。

  7. ”undefined reference to '__vthr$_pcall_va”というリンクエラーが発生する。

  8. ”cannot find -lveproginf”、および、”cannot find -lveperfcnt”というリンクエラーが発生する。

  9. VE向けの実行ファイルであることを確認したい。

  10. VE3向けのオブジェクトファイルであることを確認したい。

  11. 自動並列とOpenMP並列を混ぜてリンクするとき、-fopenmp、-mparallelのどちらを指定すればよいか。

  12. -ftraceを指定すると、実行時間が異常に長くなる。

  13. OMP_NUM_THREADSで8より大きい値を指定しても、その数のスレッドが生成されない。

  14. 定義済みマクロの名前、値を知りたい。

  15. C++プログラムのリンク時に次のようなエラーが発生した。
    /opt/nec/ve/bin/nld: __curr_eh_stack_entry: TLS reference in /tmp/nccwvkaaa.o mismatches non-TLS reference in /opt/nec/ve/ncc/2.x.x/lib/libnc++.a(iostream.o)
    /opt/nec/ve/ncc/2.x.x/lib/libnc++.a: error adding symbols: Bad value
    

  16. コードサイズの大きいプログラムをコンパイルしたときにSIGSEGVでアボートする。

  17. コンパイル時にSIGKILLが発生する。

  18. FortranプログラムとC/C++プログラムのオブジェクトファイルを混在リンクしたい。

  19. SXシリーズで利用していたプログラムの指示行をVector Engine向けに変更したい。

  20. 診断メッセージに、名前$1など、'$'の後に数字のある変数、ルーチン名が表示される。これらは何か?

  21. 診断メッセージに、変数名ではなくDOUBLE、floatなどの型名のみが表示されることがある。これらは何か?

  22. コンパイル時に指定した覚えのないコンパイラオプションが有効になっている。

  23. コンパイラのバージョンを確認したい。

  24. a.out->foo.so->bar.so というように多段の依存関係を含むプログラムをビルドするときに、以下のリンクエラーが発生する。

プログラムの実行に関するトラブルシューティング

  1. 実行時に“Node 'N' is Offline”というエラーが発生する。

  2. 実行時に使用されているノードを確認したい。

  3. 実行時に”./a.out: error while loading shared libraries: libncc.so.2: cannot open shared object file: No such file or directory”というエラーが出力される。

  4. 実行時にダイナミックリンクライブラリが見つからないというエラーが発生する。

  5. 例外発生時に例外発生個所がソースファイルの何行目に対応しているか確認したい。

  6. 例外発生時にトレースバック機能で表示される例外発生個所が正しくない。

  7. 未初期化ローカル変数を使用していないか確認したい。

  8. 未初期化ローカル変数の不定値を参照して、プログラムが異常終了するのを回避したい。

  9. 自動並列化、OpenMP機能を使用したプログラムを実行したとき、"Unable to grow stack"、または、SIGSEGVでプログラムが異常終了する。

  10. プログラムが実行時に何スレッドで動作したかを確認したい。

  11. 自動並列化、OpenMP機能を使用したプログラムを実行したとき、スレッドがいつ生成、解放されるのか知りたい。

  12. 自動並列化、OpenMP機能を使用したプログラムを実行したとき、実行時のスレッド数がどのように決まるのか知りたい。

  13. ベクトル化するとバスエラーが発生する。

  14. プログラムの実行において、必要なスタックサイズを確認したい。

プログラムのチューニングに関するトラブルシューティング

  1. プログラムにどの最適化が適用されたかを確認したい。

  2. ベクトル化を促進したにもかかわらず、性能が低下する。

  3. 自動並列化、OpenMP機能を使用したプログラムを実行したとき、PROGINFとFTRACEの同項目で表示される値が異なる。

  4. !$omp parallel num_threads(4)を指定して、環境変数OMP_NUM_THREADS=4、OMP_NUM_THREADS=5でそれぞれ実行した場合、OMP_NUM_THREADS=5のほうが並列数が多いにもかかわらず、実行時間が長くなる。

  5. FTRACEの出力に、名前$1など、'$'の後に数字のあるルーチン名が表示される。これらは何か?

インストールに関するトラブルシューティング

  1. 正しくインストールできているかを確認したい。

  2. 過去のバージョンのコンパイラをインストールしたい。

  3. 過去のバージョンのコンパイラを利用したい。

  4. 過去のバージョンのコンパイラをデフォルトにしたい。

回答内容

Fortranコンパイラ

プログラムのコンパイルに関するトラブルシューティング

  1. ”Fatal:License: Unknown host.”というコンパイルエラーが発生する。
    コンパイラのライセンスチェック時にライセンスサーバーにアクセスできない問題が発生している可能性があります。以下のHPCソフトウェアライセンス発行のページに記載されているFAQを参照してください。解決しなければ、同ページよりお問い合わせください。
    https://www.hpc-license.nec.com/aurora/

  2. “Invalid #line directive” というコンパイルエラーが発生する。
    #if、#includeなどのプリプロセッサディレクティブが使用されています。-fppを指定してコンパイルしてください。

  3. “Cannot find module: ~“というコンパイルエラーが発生する。
    モジュールが使用されていますが、そのモジュールファイル(*.mod)が見つかりません。 コンパイラがモジュールファイルをサーチするディレクトリにモジュールファイルが存在するかを確認してください。コンパイラがモジュールファイルをサーチするディレクトリについては、「Fortranコンパイラ ユーザーズガイド」を参照してください。

  4. “not a valid module information file” というコンパイルエラーが発生する。
    モジュールファイルをコンパイルしたコンパイラが古いか、モジュールファイルが壊れている可能性があります。モジュールファイル(*.mod)を再作成してください。

  5. 指示行に対して、”Syntax error”というコンパイルエラーが発生する。
    指示行の綴り、使い方が間違っていないかを確認してください。SXシリーズ向けコンパイラの指示行に対してエラーとなっているときは、コンパイラ指示行変換ツールなどでVEコンパイラの指示行に変換してください。コンパイラ指示行変換ツールについては、「Fortranコンパイラ ユーザーズガイド」を参照してください。

  6. ”Invalid input for integer editing”というコンパイルエラーが発生する。
    並び入力またはネームリスト入力の際の整数型の入力において、 入力データが不正であるときに発生します。
    このエラーは次のような場合などに発生します。 該当する入力データがないか入力ファイルをご確認ください。

    • (例) 符号(+-)に続く文字が数字ではない。
      -  10
      
      符号と数字の間に空白があるため、本エラーとなります。

    • (例) 直前のデータがR*C形式のデータで、Rで指定されたデータがまだ残っており、かつ、Cのデータが整数型でない。
      10*1.0
      
      上記例の入力データをreal::a(9)のような配列に読み込んだとき、繰り返し数10のうち9個までは配列 a の値として利用されますが、1個の入力データが残っている状態となります。この状態で整数型変数への入力を行うと、残っていた1個のデータ(実数型)が整数型変数への入力データとして扱われ、本エラーとなります。

    • (例) 整数型データに続く文字が区切り文字(空白、タブ、改行、コンマ斜線、&、$のいずれか)でない。
      20!
      10*20!
      
      数字の後に区切り文字以外があるため、本エラーとなります。

  7. ”Error: Invalid suffix”というアセンブルエラーが発生する。
    binutils-veパッケージが古い可能性があります。binutils-veパッケージが最新版であるか確認してください。

  8. モジュールファイル、ヘッダファイル、ライブラリを利用するときにコンパイラ、リンカが参照するディレクトリを確認したい。
    「Fortranコンパイラ ユーザーズガイド」を参照してください。

  9. ”undefined reference to `ftrace_region_begin_' / `ftrace_region_end_'”というリンクエラーが発生する。
    FTRACE 機能が使用されています。-ftraceを指定してリンクしてください。FTRACE 機能については「PROGINF/FTRACE ユーザーズガイド」を参照してください。

    $ nfort a.o b.o -ftrace
    

  10. ”undefined reference to '__vthr$_barrier'”というリンクエラーが発生する。
    -mparallel、または、-fopenmpを指定してリンクしてください。

  11. ”undefined reference to '__vthr$_pcall_va”というリンクエラーが発生する。
    -mparallel、または、-fopenmpを指定してリンクしてください。

  12. ”cannot find -lveproginf”、および、”cannot find -lveperfcnt”というリンクエラーが発生する。
    nec-veperfパッケージがインストールされていません。nec-veperfパッケージをインストールしてください。

  13. コードサイズの大きいプログラムをコンパイルしたときにSIGSEGVでアボートする。
    コンパイラが必要とするスタック領域の容量が設定の上限を超えている可能性があります。ulimitコマンドでスタックサイズの上限を拡大することで解消することがあります。以下のように「ulimit -s」でスタックサイズの上限値を確認できます。「ulimit -s (スタックサイズの上限値)」で上限値を変更できますので、「ulimit -s」で出力された上限値よりも大きな値を設定し、再度コンパイルしてください。

    $ ulimit -s 			(値の確認)
    8192
    $ ulimit -s 16384		(値の変更)
    

  14. コンパイル時にSIGKILLが発生する。
    コンパイルを行ったマシンのメモリが不足している可能性があります。-O0、-O1により最適化レベルを落とすことでメモリ使用量をある程度少なくすることができます。

  15. VE向けの実行ファイルであることを確認したい。
    「/opt/nec/ve/bin/nreadelf -h」に実行ファイルを指定して実行してください。「Machine:」の行に「NEC VE architecture」と出力されていれば、VE向けの実行ファイルであることを示します。

    $ /opt/nec/ve/bin/nreadelf -h a.out
    ELF Header:
      Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
      Class:                             ELF64
      Data:                              2's complement, little endian
      Version:                           1 (current)
      OS/ABI:                            UNIX - System V
      ABI Version:                       0
      Type:                              EXEC (Executable file)
      Machine:                           NEC VE architecture
      (...)
    

  16. VE3向けのオブジェクトファイルであることを確認したい。
    「/opt/nec/ve/bin/nreadelf -h」にオブジェクトファイルを指定して実行してください。「Flags:」の行に出力されている数値の右端の値が「0」であればVE1向けのオブジェクトファイル、「1」であればVE3向けのオブジェクトファイルです。以下の例では「Flags:」の行の右端の値が「1」であるため、VE3向けのオブジェクトです。

    $ /opt/nec/ve/bin/nreadelf -h a.o
    ELF Header:
      (...)
      Version:                           0x1
      Start of program headers:          0 (bytes into file)
      Start of section headers:          720 (bytes into file)
      Flags:                             0x10101
      (...)
    

  17. 自動並列とOpenMP並列を混ぜてリンクするとき、-fopenmp、-mparallelのどちらを指定すればよいか。
    -fopenmp、-mparallelのどちらか一方を指定してリンクしてください。
    $ nfort -c -mparallel a.f90
    $ nfort -c -fopenmp b.f90
    $ nfort -fopenmp a.o b.o
    

  18. -fcheckを指定すると、コンパイル時間が異常に長くなる。
    コンパイル時に実行時のチェックコードが埋め込めまれるため長くなります。実行時のチェックが必要なルーチンを含むソースファイルのコンパイル時にのみ-fcheckを指定してください。

  19. -fcheckを指定すると、実行時間が異常に長くなる。
    実行時にチェックコードが実行されるため長くなります。実行時のチェックが必要なルーチンを含むソースファイルのコンパイル時にのみ-fcheckを指定してください。

  20. -ftraceを指定すると、実行時間が異常に長くなる。
    性能情報を取得するルーチンが実行されるため長くなります。このルーチンは手続の入口、出口、ユーザ指定リージョンの前後で呼び出されます。 性能情報を取得したい手続を含むソースファイルのみ-ftraceを指定してください。

  21. OMP_NUM_THREADSで8より大きい値を指定しても、その数のスレッドが生成されない。
    VEのコア数は8個であるため、8スレッドが上限です。

  22. 定義済みマクロの名前、値を知りたい。
    「Fortranコンパイラ ユーザーズガイド」を参照してください。

  23. Fortranプログラムをプリプロセスしたい。
    -fppを指定してコンパイルしてください。

  24. FortranプログラムとC/C++プログラムのオブジェクトファイルを混在リンクしたい。
    「Fortranコンパイラ ユーザーズガイド」の多言語プログラミングの説明を参照してください。

  25. SXシリーズで利用していたプログラムのオプションをVector Engine向けに変更したい。
    「Fortranコンパイラ ユーザーズガイド」のNEC Fortran 2003のコンパイラオプションとVector Engine向けコンパイラのコンパイラオプションの対応表を参照し、SXのコンパイラオプションに対応するVEのコンパイラオプションに変更してください。

  26. SXシリーズで利用していたプログラムの指示行をVector Engine向けに変更したい。
    SXのコンパイラ指示行をVEのコンパイラ指示行に変換するツールが利用できます。
    または、「Fortranコンパイラ ユーザーズガイド」のSXシリーズ向けコンパイラとVector Engine向けコンパイラの指示行の対応表を参照し、SXのコンパイラ指示行に対応するVEのコンパイラ指示行に変更してください。

  27. 診断メッセージに、名前$1など、'$'の後に数字のある変数、ルーチン名が表示される。これらは何か?
    ベクトル化、並列化のためにコンパイラが作成した変数、ルーチンです。

  28. 診断メッセージに、変数名ではなくDOUBLE、floatなどの型名のみが表示されることがある。これらは何か?
    ベクトル化、並列化のためにコンパイラが作成した名前なし変数で、名前の代わりに型名を表示しています。

  29. Internal error detected -- please report.というメッセージが表示された。
    上記エラーが発生し、コンパイルが中断されなかった場合、コンパイラはエラーをリカバリし、コンパイルを継続しています。作成されたオブジェクトファイルはそのままご利用できます。
    コンパイルが中断された場合、NECサポートポータルよりお問い合わせください。

  30. ループ中にALLOCATE文、DEALLOCATE文がないのに次のメッセージが出力される。
    vec(181): Allocation obstructs vectorization.
    vec(182): Deallocation obstructs vectorization.
    

    Fortranにおいて、言語仕様を実現するため、コンパイラが実行時に領域を暗黙的に確保、解放しなければならなかったとき、このメッセージが出力されます。特に、手続をインライン展開した際に引数、返却値の受け取りで発生することがあります。

  31. -bssと-saveの違いについて知りたい。
    SAVE属性をもつ変数の値は、前回当該ルーチンが呼び出され、リターンしたときの値が、本呼び出し時の最初の値となりますが、-bssの場合はそれが保証されません。

  32. コンパイル時に指定した覚えのないコンパイラオプションが有効になっている。
    コンパイラオプションがオプションファイルに指定されている可能性があります。オプションファイルの詳細については「Fortranコンパイラ ユーザーズガイド」を参照してください。

  33. コンパイラのバージョンを確認したい。
    --versionを指定してください。

  34. -fpie、-fPIEオプションで位置独立実行形式の実行ファイルを作成したい。
    位置独立実行形式の実行ファイルの作成はサポートしていません。

  35. “Too many elements in array” というコンパイルエラーが発生する。
    ALLOCATE文で確保しようとしている配列のサイズ、または、配列の宣言で確保しようとしている配列のサイズが1TiBを超えています。配列のサイズを見直してください。なお、コンパイル時に配列サイズの上限を1TiBでチェックしていますが、VEのメモリサイズは48GBであるため、それより大きいサイズの配列を確保しようとすると、実行時エラー(Out of memory)となりますのでご注意ください。

  36. モジュールソースファイルをコンパイルしたとき、.Lファイルが生成されない。
    モジュール手続を含まないモジュールソースファイルに対して.Lファイルが生成されないのは、仕様どおりです。

  37. a.out->foo.so->bar.so というように多段の依存関係を含むプログラムをビルドするときに、以下のリンクエラーが発生する。
    /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,ライブラリのパス を指定してください。

  38. -mparallelを指定したとき、以下のようなWarningが発生する。
    /opt/nec/ve/bin/nld: warning: libnfort.so.2, needed by libxxx.so, not found (try using -rpath or -rpath-link)
    

    libnfort.soは、Fortranの実行時ルーチンが含まれているライブラリであり、非並列版のFortranのプログラムをリンクする際には必ず必要となります。並列版(-mparallelあるいは-fopenmp指定時)のFortranのプログラムをリンクする際には、代わりにlibnfort_m.soが必ず必要となります。コンパイラはリンク時に、非並列時は"-lnfort"、並列時は"-lnfort_m"を自動指定しています。libxxx.so が非並列で作成されており、非並列のlibnfort.soを必要としていますが、-mparallel指定時は"-lnfort"が指定されないため"-nfort"が必要という旨の警告となっています。
    実行時に予期せぬ問題が発生する可能性があるため、libxxx.so作成時(リンク時)に-mparallelか-fopenmpを追加で指定して、libxxx.soもlibnfort_m.soを参照するようにすることをお勧めします。

プログラムの実行に関するトラブルシューティング

  1. 実行時に“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
    

  2. 実行時に使用されているノードを確認したい。
    /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
    

  3. 実行時に”./a.out: error while loading shared libraries: libnfort.so.2: cannot open shared object file: No such file or directory”というエラーが出力される。
    実行環境にパッケージnec-nfort-shared、nec-nfort-shared-instをインストールしてください。手順は「インストレーションガイド」を参照してください。

  4. 実行時にダイナミックリンクライブラリが見つからないというエラーが発生する。
    共有ライブラリを配置しているディレクトリを環境変数VE_LD_LIBRARY_PATHに設定してください。環境変数VE_LD_LIBRARY_PATHについては「Fortranコンパイラ ユーザーズガイド」を参照してください。

  5. 例外発生時に例外発生個所がソースファイルの何行目に対応しているか確認したい。
    トレースバック情報から調べることができます。手順は「Fortranコンパイラ ユーザーズガイド」を参照してください。

  6. 例外発生時にトレースバック機能で表示される例外発生個所が正しくない。
    HWによる命令の先行制御によってトレースバック機能で出力される例外発生個所が正しく表示されないことがあります。環境変数VE_ADVANCEOFF=YESを設定することで先行制御を無効にできます。先行制御を無効にすることで実行時間が大幅に長くなることがありますのでご注意ください。
    $ export VE_ADVANCEOFF=YES
    

  7. 例外発生時にそれまでのバッファに書き込んだデバッグWRITE結果を出力するようにしたい。
    WRITE文の実行後にFLUSH文を呼び出してください。
    SUBROUTINE SUB()
      INTEGER :: U, X
    
      OPEN(NEWUNIT=U, FILE='debug.log', STATUS='replace')
    
      CALL SUB1(X)
    
    #ifdef DEBUG
      WRITE(U, *) 'X=', X
      FLUSH(U)
    #endif
    
    END
    

  8. 未初期化変数を使用していないか確認したい。
    倍精度浮動小数点型の未初期化変数については-minit-stack=snanを指定してコンパイル、環境変数VE_INIT_HEAP=SNANを指定して実行し、例外を検出することで確認できることがあります。単精度浮動小数点型の未初期化変数について確認するときは、snan、SNANの代わりにsnanf、SNANFをそれぞれ指定します。変数が浮動小数点型でないとき、この方法で確認することはできません。

  9. 未初期化変数の不定値を参照して、プログラムが異常終了するのを回避したい。
    -minit-stack=zeroを指定してコンパイル、環境変数VE_INIT_HEAP=ZEROを指定して実行してください。未初期化の領域をゼロクリアすることで異常終了を回避できることがあります。潜在的な問題を解決するためにもプログラムの修正を推奨します。

  10. 自動並列化、OpenMP機能を使用したプログラムを実行したとき、"Unable to grow stack"、または、SIGSEGVでプログラムが異常終了する。
    スタックの使用量が上限を超えている可能性があります。以下の方法でスタックの上限を拡張するか、スタックの使用量を削減してください。
    1. 環境変数OMP_STACKSIZEによって各スレッドが使用するスタックサイズの上限を拡張することができます。
      export OMP_STACKSIZE=2G
      
    2. -mno-stack-arraysを指定することでスタックの使用量を削減することができます。ただし、-mno-stack-arraysを指定したとき実行時間が増加することがあります。

  11. プログラムが実行時に何スレッドで動作したかを確認したい。
    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
    

  12. 自動並列化、OpenMP機能を使用したプログラムを実行したとき、スレッドがいつ生成、解放されるのか知りたい。
    既定の動作では、環境変数OMP_NUM_THREADS、または、VE_OMP_NUM_THREADSによりスレッド数が指定されたときその個数、そうでないときプログラムで利用可能なVEコア数と同じ個数のスレッドが、プログラムの実行開始前に生成され、終了時に解放されます。

  13. 自動並列化、OpenMP機能を使用したプログラムを実行したとき、実行時のスレッド数がどのように決まるのか知りたい。
    実行時のスレッド数は、環境変数OMP_NUM_THREADSやVE_OMP_NUM_THREADS、OpenMPのnum_threads句、omp_set_num_threads関数で指定することができます。優先順位は以下のとおりです。
    1. OpenMPのnum_threads句で指定した値
    2. 関数omp_set_num_threads()で指定した値
    3. 環境変数VE_OMP_NUM_THREADSで指定した値
    4. 環境変数OMP_NUM_THREADSで指定した値
    5. 利用可能なVEコア数と同じ値
    num_threads句、omp_set_num_threads()、VE_OMP_NUM_THREADS、または、OMP_NUM_THREADSに利用可能なVEコア数より大きな値を指定したとき、実行時のスレッド数は利用可能なVEコア数と同じ値になります。

  14. プログラムの実行において、必要なスタックサイズを確認したい。
    必要なスタックサイズは実行してみないとわからないため調べる方法はありません。
    なお、Fortranプログラムの場合、allocate文など実行時のメモリ確保を高速化するための領域としてプログラムの開始時にあらかじめ192MB確保します。これは allocate文の有無にかかわらず確保しますのでご注意ください。

プログラムのチューニングに関するトラブルシューティング

  1. プログラムにどの最適化が適用されたかを確認したい
    コンパイル時に出力される診断メッセージ、および、編集リストを参照してください。診断メッセージリストは-report-diagnostics、編集リストは-report-formatを指定したとき出力されます。

  2. ベクトル化を促進したにもかかわらず、性能が低下する。
    ベクトル化対象のループの繰り返し数が少ない場合、ベクトル化のためのオーバーヘッドにより性能が低下する場合があります。このようなループはnovector指示行で自動ベクトル化を抑止してください。

  3. 自動並列化、OpenMP機能を使用したプログラムを実行したとき、PROGINFとFTRACEの同項目で表示される値が異なる。
    主プログラムの実行開始前に自動生成されるスレッドのスピンウェイト分の演算数等はPROGINFでは加算されますが、FTRACEでは加算されません。

  4. !$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句の指定により、スレッド数が変更される場合、実行開始時に自動生成されたスレッドは解放され、新たにスレッドが再生成されます。

  5. FTRACEの出力に、名前$1など、'$'の後に数字のあるルーチン名が表示される。これらは何か?
    ベクトル化、並列化のためにコンパイラが作成したルーチンです。

インストールに関するトラブルシューティング

  1. 正しくインストールできているかを確認したい
    --versionを指定し、バージョンを確認します。表示されたバージョン番号がインストールした物件と同じであれば正しくインストールできています。以下のX.X.Xにバージョン番号が表示されます。
    $ /opt/nec/ve/bin/nfort --version
    nfort (NFORT) X.X.X (Build 14:10:47 Apr 23 2020)
    Copyright (C) 2018,2020 NEC Corporation.
    

  2. 過去のバージョンのコンパイラをインストールしたい。
    過去のバージョンのコンパイラのインストール手順は、SX-Aurora TSUBASAインストレーションガイドの「A.1.1 特定バージョンのコンパイラのインストール」を参照してください。

  3. 過去のバージョンのコンパイラを利用したい。
    コンパイル時に /opt/nec/ve/bin/nfort-X.X.X、ncc-X.X.X、または、nc++-X.X.X(X.X.Xはコンパイラのバージョン番号)を起動してください。

  4. 過去のバージョンのコンパイラをデフォルトにしたい。
    次の2つの方法のうちいずれかを実施してください。
    1. 各バージョンの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)に設定してください。

    2. /opt/nec/ve/bin/nfort(ncc, nc++)のパスで起動されるコンパイラを変更する。
      デフォルトにしたいバージョンのパッケージをyumコマンドでインストールします。SX-Aurora TSUBASAインストレーションガイドの「A.1.1 特定バージョンのコンパイラのインストール」-「/opt/nec/ve/bin のコンパイラの変更」を参照してください。 ※本手順は/opt/nec/ve/bin/nfort(ncc, nc++)を使用するすべてのユーザに影響する点にご注意ください。

旧コンパイラからの移行に関するトラブルシューティング

  1. 数値記憶単位「-ew」を指定している。
    以下について、プログラムの該当する記述がないか確認し修正してください。
    • 個別名の組込み関数を利用しているときは、倍精度版か総称名に修正してください。
    • プログラム中の型宣言、定数を以下に示す例のように修正してください。

      Fortran90/SXコンパイラ

      Vector Engineコンパイラ

      INTEGER*2

      INTEGER*8

      INTEGER*4

      INTEGER*8

      INTEGER(KIND=2)

      INTEGER(KIND=8)

      INTEGER(KIND=4)

      INTEGER(KIND=8)

      LOGICAL*1

      LOGICAL*8

      LOGICAL*4

      LOGICAL*8

      LOGICAL(KIND=1)

      LOGICAL(KIND=8)

      LOGICAL(KIND=4)

      LOGICAL(KIND=8)

      REAL*4

      REAL*8

      REAL(KIND=4)

      REAL(KIND=8)

      COMPLEX*8

      COMPLEX*16

      COMPLEX(KIND=4)

      COMPLEX(KIND=8)

      定数1.23E1

      定数1.23D1

      定数1.23_4

      定数1.23_8

    • 種別指定のない型での宣言を種別指定ありにプログラム修正してください。コンパイル時にコンパイラオプション-fdefault-real=8と-fdefault-integer=8を指定することでも対処することができます。

  2. 精度拡張「-A dbl」を指定している。
    以下について、プログラムの該当する記述がないか確認し修正してください。
    1. 個別名の組込み関数を利用しているときは、倍精度版か総称名に修正してください。
    2. プログラム中の型宣言、定数を以下に示す例のように修正してください。

    Fortran90/SXコンパイラ

    Vector Engineコンパイラ

    REAL*4

    REAL*8

    REAL*8

    REAL*16

    REAL(KIND=4)

    REAL(KIND=8)

    REAL(KIND=8)

    REAL(KIND=16)

    COMPLEX*8

    COMPLEX*16

    COMPLEX*16

    COMPLEX*32

    COMPLEX(KIND=4)

    COMPLEX(KIND=8)

    COMPLEX(KIND=8)

    COMPLEX(KIND=16)

    定数1.23E1

    定数1.23D1

    定数1.23D1

    定数1.23Q1

    定数1.23_4

    定数1.23_8

    定数1.23_8

    定数1.23_16

    3. 種別指定のない型での宣言を種別指定ありにプログラム修正してください。コンパイル時にコンパイラオプション-fdefault-real=8と-fdefault-double=16を指定することでも対処することができます。

  3. 精度拡張「-A dbl4」を指定している。
    以下について、プログラムの該当する記述がないか確認し修正してください。
    1. プログラム中の型宣言、定数を以下に示す例のように修正してください。

    Fortran90/SXコンパイラ

    Vector Engineコンパイラ

    REAL*4

    REAL*8

    REAL(KIND=4)

    REAL(KIND=8)

    COMPLEX*8

    COMPLEX*16

    COMPLEX(KIND=4)

    COMPLEX(KIND=8)

    定数1.23E1

    定数1.23D1

    定数1.23_4

    定数1.23_8

    2. 種別指定のない型での宣言を種別指定ありにプログラム修正してください。コンパイル時にコンパイラオプション-fdefault-real=8を指定することでも対処することができます。

  4. 精度拡張「-A dbl8」を指定している。
    以下について、プログラムの該当する記述がないか確認し修正してください。
    1. プログラム中の型宣言、定数を以下に示す例のように修正します。

    Fortran90/SXコンパイラ

    Vector Engineコンパイラ

    REAL*8

    REAL*16

    REAL(KIND=8)

    REAL(KIND=16)

    COMPLEX*16

    COMPLEX*32

    COMPLEX(KIND=8)

    COMPLEX(KIND=16)

    定数1.23D1

    定数1.23Q1

    定数1.23_8

    定数1.23_16

    2. 種別指定のない型での宣言を種別指定ありにプログラム修正してください。コンパイル時にコンパイラオプション-fdefault-double=16を指定することでも対処することができます。

  5. 精度指定(F_UFMTADJUST=TYPE2)を指定してバイナリ入力している。
    SX-ACEで環境変数F_UFMTADJUSTを指定して作成したバイナリデータの入力時には、環境変数VE_FORT_UFMTADJUSTを指定します。

  6. SX-ACEで作成したバイナリデータの入力している。
    SX-ACEで作成したバイナリデータの入力時には、環境変数VE_FORT_UFMTENDIANを指定します。

C/C++コンパイラ

プログラムのコンパイルに関するトラブルシューティング

  1. “Fatal: License: Unknown host.” というコンパイルエラーが発生する。
    コンパイラのライセンスチェック時にライセンスサーバーにアクセスできない問題が発生している可能性があります。以下のHPC ソフトウェアライセンス発行のページに記載されているFAQを参照してください。解決しなければ、同ページよりお問い合わせください。
    https://www.hpc-license.nec.com/aurora/

  2. 指示行に対して、”Syntax error”というコンパイルエラーが発生する。
    指示行の綴り、使い方が間違っていないかを確認してください。SXシリーズ向けコンパイラの指示行に対してエラーとなっているときは、コンパイラ指示行変換ツールなどでVEコンパイラの指示行に変換してください。コンパイラ指示行変換ツールについては「C/C++コンパイラ ユーザーズガイド」を参照してください。

  3. ”Error: Invalid suffix”というアセンブルエラーが発生する。
    binutils-veパッケージが古い可能性があります。binutils-veパッケージが最新版であるか確認してください。

  4. ヘッダファイル、ライブラリを利用するときにコンパイラ、リンカが参照するディレクトリを確認したい
    「C/C++コンパイラ ユーザーズガイド」を参照してください。

  5. ”undefined reference to `ftrace_region_begin' / `ftrace_region_end'”というリンクエラーが発生する。
    FTRACE機能が使用されています。-ftraceを指定してリンクしてください。FTRACE機能については「PROGINF/FTRACE ユーザーズガイド」を参照してください。
    $ ncc a.o b.o -ftrace
    

  6. ”undefined reference to '__vthr$_barrier'”というリンクエラーが発生する。
    -mparallel、または、-fopenmpを指定してリンクしてください。

  7. ”undefined reference to '__vthr$_pcall_va”というリンクエラーが発生する。
    -mparallel、または、-fopenmpを指定してリンクしてください。

  8. ”cannot find -lveproginf”、および、”cannot find -lveperfcnt”というリンクエラーが発生する。
    nec-veperfパッケージがインストールされていません。nec-veperfパッケージをインストールしてください。

  9. VE向けの実行ファイルであることを確認したい。
    「/opt/nec/ve/bin/nreadelf -h」に実行ファイルを指定して実行してください。「Machine:」の行に「NEC VE architecture」と出力されていれば、VE向けの実行ファイルであることを示します。
    $ /opt/nec/ve/bin/nreadelf -h a.out
    ELF Header:
      Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
      Class:                             ELF64
      Data:                              2's complement, little endian
      Version:                           1 (current)
      OS/ABI:                            UNIX - System V
      ABI Version:                       0
      Type:                              EXEC (Executable file)
      Machine:                           NEC VE architecture
      (...)
    

  10. VE3向けのオブジェクトファイルであることを確認したい。
    「/opt/nec/ve/bin/nreadelf -h」にオブジェクトファイルを指定して実行してください。「Flags:」の行に出力されている数値の右端の値が「0」であればVE1向けのオブジェクトファイル、「1」であればVE3向けのオブジェクトファイルです。以下の例では「Flags:」の行の右端の値が「1」であるため、VE3向けのオブジェクトです。

    $ /opt/nec/ve/bin/nreadelf -h a.o
    ELF Header:
      (...)
      Version:                           0x1
      Start of program headers:          0 (bytes into file)
      Start of section headers:          720 (bytes into file)
      Flags:                             0x10101
      (...)
    

  11. 自動並列とOpenMP並列を混ぜてリンクするとき、-fopenmp、-mparallelのどちらを指定すればよいか。
    -fopenmp、-mparallelのどちらかを指定してリンクしてください。
    $ ncc -c -mparallel a.c
    $ ncc -c -fopenmp b.c
    $ ncc -fopenmp a.o b.o
    

  12. -ftraceを指定すると、実行時間が異常に長くなる。
    性能情報を取得するルーチンが実行されるため長くなります。このルーチンは関数の入口、出口、ユーザ指定リージョンの前後で呼び出されます。
    性能情報を取得したい関数を含むソースファイルのみ-ftraceを指定してください。

  13. OMP_NUM_THREADSで8より大きい値を指定しても、その数のスレッドが生成されない。
    VEのコア数は8個であるため、8スレッドが上限です。

  14. 定義済みマクロの名前、値を知りたい。
    「C/C++コンパイラ ユーザーズガイド」を参照してください。

  15. C++プログラムのリンク時に次のようなエラーが発生した。
    /opt/nec/ve/bin/nld: __curr_eh_stack_entry: TLS reference in /tmp/nccwvkaaa.o mismatches non-TLS reference in /opt/nec/ve/ncc/2.x.x/lib/libnc++.a(iostream.o)
    /opt/nec/ve/ncc/2.x.x/lib/libnc++.a: error adding symbols: Bad value
    

    バージョン2.2.1以降のコンパイラでプログラムを再コンパイルしてください。

  16. コードサイズの大きいプログラムをコンパイルしたときにSIGSEGVでアボートする。
    コンパイラが必要とするスタック領域の容量が設定の上限を超えている可能性があります。ulimitコマンドでスタックサイズの上限を拡大することで解消することがあります。以下のように「ulimit -s」でスタックサイズの上限値を確認できます。「ulimit -s (スタックサイズの上限値)」で上限値を変更できますので、「ulimit -s」で出力された上限値よりも大きな値を設定し、再度コンパイルしてください。
    $ ulimit -s 			(値の確認)
    8192
    $ ulimit -s 16384		(値の変更)
    

  17. コンパイル時にSIGKILLが発生する。
    コンパイルを行ったマシンのメモリが不足している可能性があります。-O0、-O1により最適化レベルを落とすことでメモリ使用量をある程度少なくすることができます。

  18. FortranプログラムとC/C++プログラムのオブジェクトファイルを混在リンクしたい。
    「C/C++コンパイラ ユーザーズガイド」を参照してください。

  19. SXシリーズで利用していたプログラムの指示行をVector Engine向けに変更したい。
    SXのコンパイラ指示行をVEのコンパイラ指示行に変換するツールが利用できます。
    または、「C/C++コンパイラ ユーザーズガイド」のSXシリーズ向けコンパイラとVector Engine向けのコンパイラの指示行の対応表を参照し、SXのコンパイラオプションに対応するVEのコンパイラ指示行に変更してください。

  20. 診断メッセージに、名前$1など、'$'の後に数字のある変数、ルーチン名が表示される。これらは何か?
    ベクトル化、並列化のためにコンパイラが作成した変数、ルーチンです。

  21. 診断メッセージに、変数名ではなくDOUBLE、floatなどの型名のみが表示されることがある。これらは何か?
    ベクトル化、並列化のためにコンパイラが作成した名前なし変数で、名前の代わりに型名を表示しています。

  22. コンパイル時に指定した覚えのないコンパイラオプションが有効になっている。
    コンパイラオプションがオプションファイルに指定されている可能性があります。オプションファイルの詳細については「C/C++コンパイラ ユーザーズガイド」を参照してください。

  23. コンパイラのバージョンを確認したい。
    --versionを指定してください。

  24. a.out->foo.so->bar.so というように多段の依存関係を含むプログラムをビルドするときに、以下のリンクエラーが発生する。
    /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'
    
  25. nldの元となるGNU Linkerの仕様となります。nldはLinux/x86_64上で、SX-Aurora TSUBASAのオブジェクトをリンクするため、Cross linkerの動作となります。Cross linker動作時は実際に実行する環境と同じとは限らないため、nldは-rpathオプションや共有ライブラリ内に設定されているRPATHを無視する仕様になっています。-Wl,-rpath-link,ライブラリのパス を指定してください。

プログラムの実行に関するトラブルシューティング

  1. 実行時に“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
    

  2. 実行時に使用されているノードを確認したい。
    /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
    

  3. 実行時に”./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をインストールしてください。手順は「インストレーションガイド」を参照してください。

  4. 実行時にダイナミックリンクライブラリが見つからないというエラーが発生する。
    共有ライブラリを配置しているディレクトリを環境変数VE_LD_LIBRARY_PATHに設定してください。環境変数VE_LD_LIBRARY_PATHについては「C/C++コンパイラ ユーザーズガイド」を参照してください。

  5. 例外発生時に例外発生個所がソースファイルの何行目に対応しているか確認したい。
    トレースバック情報から調べることができます。手順は「C/C++コンパイラ ユーザーズガイド」を参照してください。

  6. 例外発生時にトレースバック機能で表示される例外発生個所が正しくない。
    HWによる命令の先行制御によってトレースバック機能で出力される例外発生個所が正しく表示されないことがあります。環境変数VE_ADVANCEOFF=YESを設定することで先行制御を無効にできます。先行制御を無効にすることで実行時間が大幅に長くなることがありますのでご注意ください。
    $ export VE_ADVANCEOFF=YES
    

  7. 未初期化ローカル変数を使用していないか確認したい。
    double型の未初期化ローカル変数については-minit-stack=snanを指定してコンパイル、実行し、例外を検出することで確認できることがあります。float型の未初期化ローカル変数について確認するときは、snanの代わりにsnanfをそれぞれ指定します。ローカル変数がdouble、float型でないとき、この方法で確認することはできません。

  8. 未初期化ローカル変数の不定値を参照して、プログラムが異常終了するのを回避したい。
    -minit-stack=zeroを指定してコンパイル、実行してください。未初期化の領域をゼロクリアすることで異常終了を回避できることがあります。潜在的な問題を解決するためにもプログラムの修正を推奨します。

  9. 自動並列化、OpenMP機能を使用したプログラムを実行したとき、"Unable to grow stack"、または、SIGSEGVでプログラムが異常終了する。
    スタックの使用量が上限を超えている可能性があります。環境変数OMP_STACKSIZEによって各スレッドが使用するスタックサイズの上限を拡張することができます。
    $ export OMP_STACKSIZE=2G
    

  10. プログラムが実行時に何スレッドで動作したかを確認したい。
    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
    

  11. 自動並列化、OpenMP機能を使用したプログラムを実行したとき、スレッドがいつ生成、解放されるのか知りたい。
    既定の動作では、環境変数OMP_NUM_THREADS、または、VE_OMP_NUM_THREADSによりスレッド数が指定されたときその個数、そうでないときプログラムで利用可能なVEコア数と同じ個数のスレッドが、プログラムの実行開始前に生成され、終了時に解放されます。

  12. 自動並列化、OpenMP機能を使用したプログラムを実行したとき、実行時のスレッド数がどのように決まるのか知りたい。
    実行時のスレッド数は、環境変数OMP_NUM_THREADSやVE_OMP_NUM_THREADS、OpenMPのnum_threads句、omp_set_num_threads関数で指定することができます。優先順位は以下のとおりです。
    1. OpenMPのnum_threads句で指定した値
    2. 関数omp_set_num_threads()で指定した値
    3. 環境変数VE_OMP_NUM_THREADSで指定した値
    4. 環境変数OMP_NUM_THREADSで指定した値
    5. 利用可能なVEコア数と同じ値
    num_threads句、omp_set_num_threads()、VE_OMP_NUM_THREADS、または、OMP_NUM_THREADSに利用可能なVEコア数より大きな値を指定したとき、実行時のスレッド数は利用可能なVEコア数と同じ値になります。

  13. ベクトル化するとバスエラーが発生する。
    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)));
    

  14. プログラムの実行において、必要なスタックサイズを確認したい。
    必要なスタックサイズは実行してみないとわからないため調べる方法はありません。

プログラムのチューニングに関するトラブルシューティング

  1. プログラムにどの最適化が適用されたかを確認したい。
    コンパイル時に出力される診断メッセージ、および、編集リストを参照してください。診断メッセージリストは-report-diagnostics、編集リストは-report-formatを指定したとき出力されます。
    詳細は、「C/C++コンパイラ ユーザーズガイド」を参照してください。

  2. ベクトル化を促進したにもかかわらず、性能が低下する。
    ベクトル化対象のループの繰り返し数が少ない場合、ベクトル化のためのオーバーヘッドにより性能が低下する場合があります。このようなループはnovector指示行で自動ベクトル化を抑止してください。

  3. 自動並列化、OpenMP機能を使用したプログラムを実行したとき、PROGINFとFTRACEの同項目で表示される値が異なる。
    主プログラムの実行開始前に自動生成されるスレッドのスピンウェイト分の演算数等はPROGINFでは加算されますが、FTRACEでは加算されません。

  4. !$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句の指定により、スレッド数が変更される場合、実行開始時に自動生成されたスレッドは解放され、新たにスレッドが再生成されます。

  5. FTRACEの出力に、名前$1など、'$'の後に数字のあるルーチン名が表示される。これらは何か?
    ベクトル化、並列化のためにコンパイラが作成したルーチンです。

インストールに関するトラブルシューティング

  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.
    

  2. 過去のバージョンのコンパイラをインストールしたい。
    過去のバージョンのコンパイラのインストール手順は、SX-Aurora TSUBASAインストレーションガイドの「A.1.1 特定バージョンのコンパイラのインストール」を参照してください。

  3. 過去のバージョンのコンパイラを利用したい。
    コンパイル時に /opt/nec/ve/bin/nfort-X.X.X、ncc-X.X.X、または、nc++-X.X.X(X.X.Xはコンパイラのバージョン番号)を起動してください。

  4. 過去のバージョンのコンパイラをデフォルトにしたい。
    次の2つの方法のうちいずれかを実施してください。
    1. 各バージョンの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)に設定してください。

    2. /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)を使用するすべてのユーザに影響する点にご注意ください。

製品名カテゴリ

SX-Aurora TSUBASA Software

補足/関連情報

改版履歴

  • 2021/09/30 新規公開
  • 2021/11/30 英語版新規公開にともなう日本語版へのフィードバック
  • 2022/03/29 項目の追加
  • 2022/06/29 項目の追加
  • 2024/02/29
     追加:
      FortranコンパイラおよびC/C++コンパイラ
       プログラムの実行に関するトラブルシューティング
        13.  自動並列化、OpenMP機能を使用したプログラムを実行したとき、
        実行時のスレッド数がどのように決まるのか知りたい。
     変更:
      FortranコンパイラおよびC/C++コンパイラ
       インストールに関するトラブルシューティング
         4.  過去のバージョンのコンパイラをデフォルトにしたい。
  • 関連文書

    • Fortranコンパイラ ユーザーズガイド
    • C/C++コンパイラ ユーザーズガイド
    • PROGINF/FTRACE ユーザーズガイド
    • SX-Aurora TSUBASA インストレーションガイド

    • 上記の関連文書はこちらよりご参照頂けます。

    • コンテンツID: 3150115802
    • 公開日: 2021年09月30日
    • 最終更新日:2024年02月29日

    アンケート

    サポート情報充実のためアンケートにご協力をお願いいたします。



    コメント欄:
    ここからページ共通メニューです。 ページ共通メニューを読み飛ばす。