SX-Aurora TSUBASA SDKの使い方メモ

June 1, 2022 (Updated on: November 24, 2022)
by Keichi Takahashi

NECのマニュアルを参照するのが面倒なので,自分用に雑多な情報をまとめたメモです.

ツールチェーン

コンパイラ

  • C, C++, Fortranのコンパイラはそれぞれncc, nc++, nfort
  • 標準のbinutilsはVEに対応していないので,nでprefixされたbinutilsを使う. nreadelf, nnm, nobjdumpなどがある.
  • 最適化レベルは-O1から-O4まである.
  • デフォルトではインライン展開しないので,C++コードではベクトル化がかなり限定的である. -finline-functionsをつけて自動インライン化を有効にするとベクトル化が促進される.
  • コンパイラを実行する際に-report-allというオプションをつけるとソースコード.L というファイルが生成され,どのようにベクトル化・最適化されたのか確認できる.
  • 非常に大きいコードをコンパイル時するとスタック不足でコンパイラが落ちることがある. その場合はulimit -sでスタックサイズを増やすと成功するかもしれない.
  • NECコンパイラでは__NEC__マクロが定義される

デバッグ

  • エラー時にスタックトレースを表示するには,実行時に環境変数VE_TRACEBACK=ALLを設定する
  • スタックトレースにファイル名や行番号を表示するには, コンパイル時にオプション-traceback=verbose -gを指定した上で,実行時に環境変数VE_TRACEBACK=VERBOSEを設定する
    • MPIプログラムの場合は環境変数NMPI_VE_TRACEBACK=ONを設定する

監視ツール

  • /opt/nec/ve/bin以下のtop, ps, free, vmstat, straceでVE上のプロセスを確認できる
  • ve_execでプログラムを実行するVEとコアを指定可能

性能測定

PROGINF

  • 実行時に環境変数VE_PROGINF=DETAILと設定すると性能の概要が出力される.

FTRACE

  • -ftraceオプションをつけてコンパイル後,実行する.ftrace.outというファイルができるので,ftraceコマンドを同じディレクトリで実行
  • ルーフライン解析
    • REQ B/F: REQ. B/F そのまま
    • ACT B/F: REQ.ST B/F + ACT.VLD B/F
  • ベクトル化率V.OP RATIOはベクトル命令数/全命令数 (実行時間ではないことに注意)
    • 実行時間での内訳はEXCLUSIVE TIMEとVECTOR TIMEを見る
  • ftrace_region_begin()ftrace_region_end()でコードを囲むとその部分の 性能を測定することができる.ヘッダファイル (ftrace.h) のincludeが必要.
  • -ftraceオプションをつけてコンパイルすると_FTRACEというマクロが定義される ので,ftrace_region_*()の呼び出しは#ifdef _FTRACEで囲むといい.

並列化

OpenMP

  • “Unable to grow stack"というエラーが表示された場合は,スタックサイズが不足している. export OMP_STACKSIZE=2Gなどでスタックサイズを拡張すると良い.
  • スレッド数はOMP_NUM_THREADSまたはVE_OMP_NUM_THREADSという環境変数で設定 する.VE_OMP_NUM_THREADSの方が優先順位が高いので,VHとVEでスレッド数を変 えたいときはVHのスレッド数をOMP_NUM_THREADS,VEのスレッド数をVE_OMP_NUM_THREADS で設定すると良い.

MPI

  • mpincc, mpinc++, mpinfortが内部で呼ぶコンパイラはそれぞれNMPI_CC, NMPI_CXX, NMPI_FC環境変数で設定できる.
  • mpincc/nc++/fort-mpiprofをつけるとMPIプロファイラが有効になる. このオプションがないとPMPIのシンボルが定義されないため, 外部のMPIプロファイラを使用する際も付ける必要がある.
  • NMPI_COMMINF=YESを設定すると,MPI通信のプロファイリング結果が表示される.

NUMAモード

  • NUMAモードではメモリ帯域幅は変わらないが,キャッシュ帯域幅が約2.1TB/sから3.0TB/sに向上する (Type 20Bの場合)
  • venumainfoでNUMA情報を確認可能
  • VE_NUMA_OPT--cpunodebind--localmembindが設定可能

設定方法は,root権限で下記を実行する:

# vecmd vconfig set partitioning_mode on # またはoff
# vecmd state set off
# vecmd state set mnt
# vecmd reset card