SX-Aurora TSUBASA SDKの使い方メモ

June 1, 2022 (Updated on: December 2, 2023)
by Keichi Takahashi

NECのマニュアル (PDF) を毎回参照するのが面倒なので,自分用に雑多な情報をまとめたメモです. 適宜更新しています.

ツールチェーン

コンパイラ

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

デバッグ

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

監視ツール

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

性能測定

PROGINF

  • 実行時に環境変数VE_PROGINF=DETAILと設定すると性能の概要が出力される.
  • MPIプログラムでは,NMPI_PROGINF=YESを設定すると,PROGINF情報が全ランクに渡って集計されて表示される.
    • VE_PROGINF=DETAILでは各ランクが独立にPROGINF情報を出力してしまうので注意.

FTRACE

  • -ftraceオプションをつけてコンパイル後,実行する.ftrace.outというファイルができるので,ftraceコマンドを同じディレクトリで実行
  • ルーフライン解析を行うには,ftrace実行に VE_PERF_MODE環境変数にVECTOR-MEMを設定し, メモリアクセスのプロファイルを収集する
    • LLCにおけるB/F (NEC用語ではREQ B/F) = REQ. B/F
    • HBMにおけるB/F (NEC用語では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環境変数で設定できる.
  • 通信時間をプロファイルするには,コンパイル時に-mpiprofオプションをつけた上で, 実行時に NMPI_COMMINF=YES環境変数を設定する.
    • -mpiprofオプションがないとPMPIのシンボルが定義されないため,外部のMPIプロファイラを使用する際も必要.
  • FTRACEも使用可能
    • ftrace.out.*.*という名前でランクごとにFTRACEファイルが出力される.
    • FTRACEファイルはランクごとに分析できる他,ftrace -f ftrace.out.*と全ランクのファイルをftraceコマンドの引数に渡すと,全ランクの情報が集計される.

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