このトピックでは、High-Performance Linpack(HPL)を使用して Elastic High Performance Computing(E-HPC)クラスターの 1 秒あたりの浮動小数点演算回数(FLOPS)をテストする方法について説明します。
背景情報
HPL は、高性能コンピューティングクラスターの FLOPS をテストするために使用されるベンチマークです。 HPL は、高性能コンピューティングクラスターの浮動小数点演算能力を評価できます。評価は、ガウスの消去法を使用して N 次の密な線形単項方程式を解くテストに基づいています。
ピーク FLOPS は、コンピューターが 1 秒あたりに実行できる浮動小数点演算の回数です。ピーク FLOPS は、理論上のピーク FLOPS と実際のピーク FLOPS の 2 つのタイプに分けることができます。理論上のピーク FLOPS は、コンピューターが理論的に 1 秒あたりに実行できる浮動小数点演算の回数です。理論上のピーク FLOPS は、CPU のクロック速度によって決まります。理論上のピーク FLOPS は、次の式を使用して計算されます。理論上のピーク FLOPS = CPU のクロック速度× CPU コア数× CPU が 1 サイクルあたりに実行する浮動小数点演算回数。このトピックでは、HPL を使用して実際のピーク FLOPS をテストする方法について説明します。
準備
E-HPC クラスターを作成します。詳細については、「ウィザードを使用してクラスターを作成する」をご参照ください。
以下のパラメーターを構成します。
パラメーター
説明
ハードウェア設定
1 つの管理ノードと 1 つの計算ノードを持つ小さなクラスターをデプロイします。管理ノードと計算ノードには、次の仕様が必要です。
管理ノード:管理ノードは、2 つの vCPU と 4 GiB のメモリを持つ ecs.c7.large Elastic Compute Service(ECS)インスタンスである必要があります。
計算ノード:計算ノードは、96 個の vCPU と 192 GiB のメモリを持つ ecs.ebmc5s.24xlarge ECS インスタンスである必要があります。
ソフトウェア設定
CentOS 7.6 パブリックイメージと PBS スケジューラーをデプロイします。
クラスターユーザーを作成します。詳細については、「ユーザーを作成する」をご参照ください。
ユーザーは、クラスターへのログオン、LAMMPS のコンパイル、ジョブの送信に使用されます。この例では、次の情報を使用してユーザーを作成します。
ユーザー名:hpltest
ユーザーグループ:sudo 権限グループ
ソフトウェアをインストールします。詳細については、「ソフトウェアをインストールする」をご参照ください。
次のソフトウェアが必要です。
LINPACK 2018
Intel MPI 2018
ステップ 1:クラスターに接続する
次のいずれかの方法を使用してクラスターに接続します。この例では、testuser をユーザー名として使用します。クラスターに接続すると、デフォルトで /home/hpltest に自動的にログオンします。
E-HPC クライアントを使用してクラスターにログオンする
クラスターのスケジューラーは PBS である必要があります。 E-HPC クライアントをダウンロードしてインストールし、クライアントに必要な環境をデプロイしていることを確認してください。詳細については、「E-HPC クライアントの環境をデプロイする」をご参照ください。
E-HPC クライアントを起動してログオンします。
左側のナビゲーションペインで、[セッション管理] をクリックします。
[セッション管理] ページの右上隅にある [ターミナル] をクリックして、ターミナルウィンドウを開きます。
E-HPC コンソールを使用してクラスターにログオンする
E-HPC コンソール にログオンします。
上部ナビゲーションバーの左上隅で、リージョンを選択します。
左側のナビゲーションペインで、[クラスター] をクリックします。
[クラスター] ページで、クラスターを見つけて [接続] をクリックします。
[接続] パネルで、ユーザー名とパスワードを入力し、[SSH 経由で接続] をクリックします。
ステップ 2:ジョブを送信する
次のコマンドを実行して、HPL.dat という名前のスタディファイルを作成します。
vim HPL.datHPL.dat ファイルには、HPL を実行するためのパラメーターが含まれています。次のコードは、単一の ecs.ebmc5s.24xlarge インスタンスで HPL を実行するための推奨構成の例を示しています。
HPLinpack benchmark input file Innovative Computing Laboratory, University of Tennessee HPL.out output file name (if any) // 出力ファイル名(存在する場合) 6 device out (6=stdout,7=stderr,file) // デバイス出力 (6=標準出力,7=標準エラー出力,ファイル) 1 # of problems sizes (N) // 問題サイズの数 (N) 143600 Ns // 問題サイズ 1 # of NBs // ブロックサイズの数 384 NBs // ブロックサイズ 1 PMAP process mapping (0=Row-,1=Column-major) // プロセスマッピング (0=行優先,1=列優先) 1 # of process grids (P x Q) // プロセスグリッドの数 (P x Q) 1 Ps // 行方向のプロセッサ数 1 Qs // 列方向のプロセッサ数 16.0 threshold // しきい値 1 # of panel fact // パネルファクタライゼーションの数 2 PFACTs (0=left, 1=Crout, 2=Right) // パネルファクタライゼーション (0=左, 1=Crout, 2=右) 1 # of recursive stopping criterium // 再帰停止基準の数 2 NBMINs (>= 1) // 再帰停止基準 1 # of panels in recursion // 再帰におけるパネルの数 2 NDIVs // 再帰におけるパネルの数 1 # of recursive panel fact. // 再帰的パネルファクタライゼーションの数 1 RFACTs (0=left, 1=Crout, 2=Right) // 再帰的パネルファクタライゼーション (0=左, 1=Crout, 2=右) 1 # of broadcast // ブロードキャストの数 0 BCASTs (0=1rg,1=1rM,2=2rg,3=2rM,4=Lng,5=LnM) // ブロードキャスト 1 # of lookahead depth // 先読み深度の数 0 DEPTHs (>=0) // 先読み深度 0 SWAP (0=bin-exch,1=long,2=mix) // スワップ (0=バイナリ交換,1=ロング,2=ミックス) 1 swapping threshold // スワップしきい値 1 L1 in (0=transposed,1=no-transposed) form // L1 の形式 (0=転置,1=非転置) 1 U in (0=transposed,1=no-transposed) form // U の形式 (0=転置,1=非転置) 0 Equilibration (0=no,1=yes) // 平衡化 (0=なし,1=あり) 8 memory alignment in double (> 0) // double 型のメモリアライメントノードのハードウェア設定に基づいて、HPL.dat ファイルのパラメーターを調整できます。次の例では、パラメーターについて説明します。
5 行目と 6 行目の内容:
1 # of problems sizes (N) 143600 NsN は、解きたい行列のサイズを示します。行列サイズ N が大きいほど、すべての演算に対する有効な演算の割合が大きくなります。したがって、N が大きいほど、システムの FLOPS が高くなります。ただし、行列サイズが大きいとメモリ使用量が増加します。システムの使用可能なメモリ領域が不足すると、代わりにキャッシュが使用されます。したがって、システムのパフォーマンスが大幅に低下します。行列が占めるシステムメモリの最適な使用率は約 80% です。次の式を使用して N の値を計算します。N × N × 8 = システムメモリ合計× 80%。合計メモリの単位はバイトです。
7 行目と 8 行目の内容:
1 # of NBs 384 NBsNB は、行列が解かれるときのブロック行列のサイズを示します。ブロックサイズは、システムのパフォーマンスに大きな影響を与えます。NB の値は、ハードウェアやソフトウェアなど、複数の要因の影響を受けます。NB の最適値は、実際のテストから得られます。NB の値は、次の条件を満たします。
NB の値は、大きすぎても小さすぎてもいけません。ほとんどの場合、値は 384 未満です。
NB × 8 の積は、キャッシュライン数の倍数である必要があります。
NB の値は、通信モード、行列サイズ、ネットワークの状態、クロック速度など、複数の要因によって決まります。
単一ノードまたは単一 CPU のテストから、適切な NB 値をいくつか得ることができます。ただし、システム容量が増加し、より大きなメモリ領域が必要な場合、これらの NB 値の一部は FLOPS の低下につながる可能性があります。したがって、小規模テストで満足のいく FLOPS をもたらす 3 つの NB 値を選択することをお勧めします。このようにして、大規模テストを実行して最適な NB 値を決定できます。
10 行目、11 行目、12 行目の内容:
1 # of process grids (P x Q) 1 Ps 1 QsP は行のプロセッサ数を示し、Q は列のプロセッサ数を示します。P と Q の積は、2 次元プロセッサグリッドを表します。式:P × Q = プロセス数。ほとんどの場合、1 つの CPU が 1 つのプロセスを処理する場合、FLOPS は最適です。Intel ®Xeon ® の場合、ハイパースレッディング(HT)を無効にすることで HPL パフォーマンスを向上させることができます。ほとんどの場合、P と Q の値は次の条件を満たします。
P ≤ Q。ほとんどの場合、P の値は Q の値よりも小さくなります。これは、列の通信の数とデータ量が、行の通信の数とデータ量よりもはるかに大きいためです。
P の値を 2 の指数乗に設定することをお勧めします。HPL では、水平方向の通信にバイナリ交換が使用されます。水平方向のプロセッサ数(P)が 2 の累乗に等しい場合、FLOPS は最適です。
次のコマンドを実行して、hpl.pbs という名前のジョブスクリプトファイルを作成します。
vim hpl.pbsサンプルスクリプト:
説明この例では、単一ノードの実際のピーク FLOPS のみがテストされます。複数ノードのピーク FLOPS をテストする場合は、次の構成ファイルを修正できます。
#!/bin/sh #PBS -j oe export MODULEPATH=/opt/ehpcmodulefiles/ module load linpack/2018 module load intel-mpi/2018 echo "run at the beginning" // 開始時に実行 mpirun -n 1 -host compute000 /opt/linpack/2018/xhpl_intel64_static > hpl-output // 単一ノードの FLOPS をテストします。<compute000> を、ジョブが実行されるノードの実際の名前に置き換えます。 #mpirun -n <N> -ppn 1 -host <node0>,...,<nodeN> /opt/linpack/2018/xhpl_intel64_static > hpl-ouput // 複数ノードの FLOPS をテストします。変数をテストの実際の値に置き換えます。次のコマンドを実行して、ジョブを送信します。
qsub hpl.pbs次のコマンド出力が返されます。これは、生成されたジョブ ID が 0.manager であることを示しています。
0.manager
ステップ 3:ジョブ結果を表示する
次のコマンドを実行して、ジョブの実行状態を表示します。
qstat -x 0.manager次のコードが返されます。レスポンスでは、
S列のRはジョブが実行中であることを示し、S列のFはジョブが完了していることを示します。Job id Name User Time Use S Queue ---------------- ---------------- ---------------- -------- - ----- 0.manager hpl.pbs hpltest 11:01:49 F workq次のコマンドを実行して、ジョブ結果を表示します。
cat /home/hpltest/hpl-outputテストでは、次の結果が生成されます。
