計算ノードは,2台のCPU (システムMはIntel Xeon CPU Max 9480, システムPはIntel Xeon Platinum 8480+で,いずれも1CPU当たり56コア)で構成されています。
各CPUは,4つのCPUタイル(14コア)に分かれており,それぞれのCPUタイルには独立したメモリが接続しています。この「CPUタイル+メモリ」の単位をNUMA(Non-Uniform Memory Access)ノードと呼びます。そのため1CPU当たり4つのNUMAノードがあります。計算ノード当たり合計で8つのNUMAノードがあります。
CPUタイルに接続しているメモリは,システムMとPで異なります。
システムMの各CPUタイルには,16GBのHBM2e (High Bandwidth Memory 2 Extended)が接続され,システムPの各CPUタイルには,64GBのDDR5-4800 SDRAMが接続されています。
異なるNUMAノード間,すなわち他のCPUタイルに接続されたメモリへのアクセスは,通信速度が低下する傾向にあります。
以下に示すのは,実行バイナリの名前を./a.outとした場合の例です。
適宜「./a.out」を自分の実行バイナリ名に置き換えてください。
- CPE環境を有効
- sh/bash
$ source /work/opt/local/bin/enable-cpe.sh - csh/tcsh
$ source /work/opt/local/bin/enable-cpe.csh - perftoolsをロード
- ソースコードを再コンパイルして,実行バイナリをpatバイナリ(a.out+pat)形式に変換
- CrayPatはオブジェクトファイル(*.o)を参照しますので,オブジェクトファイルを経由さずに直接実行バイナリを生成した状態でpatバイナリへ変換するとエラーとなります。
- また,再コンパイルせずに, pat_buildを実行すると,「ERROR: Missing required ELF section '.note.link' from the program (実行バイナリ). Load the correct 'perftools' module and rebuild the program.」というエラーが出ます。
- 大容量メモリを利用するプログラムの場合「 /usr/bin/ld: failed to convert GOTPCREL relocation; relink with --no-relax」というエラーが出ることがあります。リンクの際におこなわれるアドレス割り当ての最適化作業に必要なメモリ量が不足してしまうことが原因と考えられます。「 -Wl,--no-relax」をリンクの際に付けていただくと最適化を抑制します。
上の例ですと,「 $ cc -Wl,--no-relax -o ./a.out sample.o」です。 - srunを使ってa.out+patをバッチジョブとして実行
- レポートを生成
- システムMを8ノード利用する(1ノード当たり64並列の場合。カテゴリAへの申請が必要)。
- システムPを2ノード利用する(1ノード当たり64並列の場合)。
注:CrayPatは,Crayコンパイラでしか正しく動作しません。
$ module load perftools-base $ module load perftools |
再コンパイルする際は最適化オプションを外すことが推奨されています。
$ cc -c sample.c $ cc -o ./a.out sample.o $ pat_build ./a.out |
実行すると,a.out+patができます。「a.out」の部分は実行バイナリの名前に置き換わります。
注意点
以下は1ノードを使い,32プロセスで実行する例です。2つのNUMAノードにそれぞれ16プロセスを配分しています。
ジョブスクリプトでもperftoolsモジュールをロードしてください。
#!/bin/bash #SBATCH --job-name=memtest #SBATCH --partition=??? #SBATCH --nodes=1 #SBATCH --ntasks=64 #SBATCH --ntasks-per-socket=32 #SBATCH --cpus-per-task=1 #SBATCH --mem=10G #SBATCH --hint=nomultithread module load perftools-base module load perftools module list cd $SLURM_SUBMIT_DIR srun ./a.out+pat
ジョブの実行が完了すると,計測データディレクトリa.out+pat+PID+nodeIDsが作成されています。
計測データをもとにレポートを作成するには,以下のコマンドを実行します。
$ pat_report -o sampling.txt a.out+pat+PID+nodeIDs |
上記はレポートファイル名をsampling.txtとした例です。sampling.txtの中でTable 9にメモリ使用量が記載されています。
(Tableの番号は計算によって異なる可能性があります。)
以下に例を示します。
Table 9: Wall Clock Time, Memory High Water Mark Process | Process | PE=[mmm] Time | HiMem | | (MiBytes) | 10.191880 | 1,111.0 | Total |-------------------------------- | 10.211021 | 1,110.9 | pe.20 | 10.202020 | 1,110.9 | pe.49 | 10.106731 | 1,111.0 | pe.63 |================================
この表は、ランク(プロセス)ごとのWall clock時間(ジョブの開始から終了までの経過時間)のうち、最大値・平均値・最小値をもつランクのデータが記載されています。
HiMemは,Memory high water markの意味で最大メモリ使用量に対応します。「Total」のHiMemがランク平均したHiMemを表します。
この例では,64並列の計算を行いましたので,全メモリ使用量は1111.0MiBx64 = 69.4GiB = 74.6 GBとなります (ここで1GiB=1024^3/1000^3 GB)。一方,システムMの1ノードに搭載されたメモリは128GBですので,同じ解像度での計算はシステムM1ノードで実行可能です。
格子幅を半分にする場合は,メモリ使用量がおおよそ2^3倍(約600 GB)となり,システムMの1ノードでは計算を実行できなくなります。その場合は以下の選択肢をご検討ください。