このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
HPC チャレンジによるクラスターのベンチマーク
この例では、HPC チャレンジ ベンチマークを使用して計算クラスターのパフォーマンスを評価する方法を説明します。このベンチマークは、異なるメモリ アクセス パターンを測定する複数のテストで構成されます。詳細については、HPC チャレンジ ベンチマークを参照してください。
HPC チャレンジの準備
関数 parpool
を使用して、クラスターでワーカーの並列プールを起動します。既定で、parpool
は既定のクラスター プロファイルを使用して並列プールを作成します。既定のクラスター プロファイルは、[ホーム] タブの [並列]、[既定のクラスターの選択] で確認してください。このベンチマークでは、ワーカーは相互に通信します。ワーカー間の通信が最適化されるように、'SpmdEnabled'
を true
に設定します。
pool = parpool(64,'SpmdEnabled',true);
Starting parallel pool (parpool) using the 'MyCluster' profile ... Connected to parallel pool with 64 workers.
関数 hpccDataSizes
を使用して、HPC チャレンジの要件を満たす各ベンチマークの問題の規模を計算します。この規模は、ワーカー数および各ワーカーで使用できるメモリ量によって決まります。たとえば、各ワーカーに 1 GB の使用を許可します。
gbPerWorker = 1; dataSizes = hpccDataSizes(pool.NumWorkers,gbPerWorker);
HPC チャレンジの実行
HPC チャレンジ ベンチマークは複数の部分で構成され、それぞれが異なる観点からシステムのパフォーマンスを調べます。次のコードでは、各関数が 1 つのベンチマークを実行し、パフォーマンス結果を含む 1 行の table を返します。これらの関数は、分散配列に対する様々な演算をテストします。MATLAB は、複数の並列ワーカーにわたって分散配列を分割するため、並列ワーカーはクラスターの結合されたメモリ リソースおよび計算リソースを使用できます。分散配列の詳細については、分散配列を参照してください。
HPL
hpccHPL(m)
は Linpack ベンチマークとして知られており、線形方程式系の求解の実行レートを測定します。サイズが m
行 m
列のランダムに分散した実数行列 A
と、長さが m
のランダムに分散した実数ベクトル b
を作成し、方程式系 x = A\b
の並列的な求解に要する時間を測定します。パフォーマンスはギガフロップス (10 億単位による、1 秒あたりの浮動小数点演算の回数) で返されます。
hplResult = hpccHPL(dataSizes.HPL);
Starting HPCC benchmark: HPL with data size: 27.8255 GB. Running on a pool of 64 workers Analyzing and transferring files to the workers ...done. Finished HPCC benchmark: HPL in 196.816 seconds.
DGEMM
hpccDGEMM(m)
は、実数行列同士の乗算の実行レートを測定します。サイズが m
行 m
列のランダムに分散した実数行列 A
、B
および C
を作成し、行列乗算 C = beta*C + alpha*A*B
の並列実行に要する時間を測定します。ここで、alpha
および beta
はランダムなスカラーです。パフォーマンスはギガフロップス単位で返されます。
dgemmResult = hpccDGEMM(dataSizes.DGEMM);
Starting HPCC benchmark: DGEMM with data size: 9.27515 GB. Running on a pool of 64 workers Analyzing and transferring files to the workers ...done. Finished HPCC benchmark: DGEMM in 69.3654 seconds.
STREAM
hpccSTREAM(m)
は、クラスターのメモリ帯域幅を評価します。長さが m
のランダムに分散したベクトル b
と c
、およびランダムなスカラー k
を作成し、a = b + c*k
を計算します。このベンチマークでは、ワーカー間の通信を使用しません。パフォーマンスは GB/秒の単位で返されます。
streamResult = hpccSTREAM(dataSizes.STREAM);
Starting HPCC benchmark: STREAM with data size: 10.6667 GB. Running on a pool of 64 workers Analyzing and transferring files to the workers ...done. Finished HPCC benchmark: STREAM in 0.0796962 seconds.
PTRANS
hpccPTRANS(m)
は、システムのプロセス間通信の速度を測定します。サイズが m
行 m
列のランダムに分散した 2 つの行列 A
と B
を作成し、A' + B
を計算します。結果は GB/秒の単位で返されます。
ptransResult = hpccPTRANS(dataSizes.PTRANS);
Starting HPCC benchmark: PTRANS with data size: 9.27515 GB. Running on a pool of 64 workers Analyzing and transferring files to the workers ...done. Finished HPCC benchmark: PTRANS in 6.43994 seconds.
RandomAccess
hpccRandomAccess(m)
は分散したベクトル内でランダムに更新できるメモリ位置の 1 秒あたりの数を測定します。結果は GUPS (1 秒あたりのギガ単位の更新数) の単位で返されます。このテストで、ワーカーは MEX 関数にコンパイルされた乱数発生器を使用します。各オペレーティング システム アーキテクチャについて、この MEX 関数のバージョンを並列プールに付加します。これにより、ワーカーはそのオペレーティング システムに対応するバージョンにアクセスできます。
addAttachedFiles(pool,{'hpccRandomNumberGeneratorKernel.mexa64','hpccRandomNumberGeneratorKernel.mexw64','hpccRandomNumberGeneratorKernel.mexmaci64'}); randomAccessResult = hpccRandomAccess(dataSizes.RandomAccess);
Starting HPCC benchmark: RandomAccess with data size: 16 GB. Running on a pool of 64 workers Analyzing and transferring files to the workers ...done. Finished HPCC benchmark: RandomAccess in 208.103 seconds.
FFT
hpccFFT(m)
は、長さが m
の分散したベクトルについて高速フーリエ変換 (FFT) を並列計算した場合の実行レートを測定します。このテストは、システムの演算能力と通信パフォーマンスの両方を測定します。パフォーマンスはギガフロップス単位で返されます。
fftResult = hpccFFT(dataSizes.FFT);
Starting HPCC benchmark: FFT with data size: 8 GB. Running on a pool of 64 workers Analyzing and transferring files to the workers ...done. Finished HPCC benchmark: FFT in 11.772 seconds.
結果の表示
各ベンチマークの結果は、統計値を含む 1 行の table です。これらの行を結合して、テスト結果の概要を提供します。
allResults = [hplResult; dgemmResult; streamResult; ...
ptransResult; randomAccessResult; fftResult];
disp(allResults);
Benchmark DataSizeGB Time Performance PerformanceUnits ______________ __________ ________ ___________ ________________ "HPL" 27.826 196.82 773.11 "GFlops" "DGEMM" 9.2752 69.365 1266.4 "GFlops" "STREAM" 10.667 0.079696 431.13 "GBperSec" "PTRANS" 9.2752 6.4399 1.5465 "GBperSec" "RandomAccess" 16 208.1 0.010319 "GUPS" "FFT" 8 11.772 6.6129 "GFlops"
batch
を使用した計算のオフロード
関数 batch
を使用して HPC チャレンジの計算をクラスターにオフロードし、MATLAB での作業を続行できます。
batch
を使用する前に、現在の並行プールを削除します。並列プールが既に使用可能なすべてのワーカーを使用している場合、バッチ ジョブを処理できません。
delete(gcp);
batch
を使用して、関数 hpccBenchmark
をバッチ ジョブとしてクラスターに送信します。この関数は、HPC チャレンジのテストを呼び出し、結果を table に返します。batch
を使用する場合、ワーカーは MATLAB クライアントの役割を担い、関数を実行します。さらに、以下の名前と値のペアの引数を指定します。
'Pool'
:ジョブ用にワーカーの並列プールを作成します。この例では、32
個のワーカーを指定します。hpccBenchmark
はこれらのワーカーで HPC チャレンジを実行します。'AttachedFiles':
プール内のワーカーにファイルを転送します。この例では、各オペレーティング システム アーキテクチャについてhpccRandomNumberGeneratorKernel
のバージョンを付加します。ワーカーはhpccRandomAccess
テストを実行するときに、各自のオペレーティング システムに対応するものにアクセスします。'CurrentFolder'
:ワーカーの作業ディレクトリを設定します。この引数を指定しない場合、MATLAB はワーカーの現在のディレクトリを MATLAB クライアントの現在のディレクトリに変更します。代わりにワーカーの現在のフォルダーを使用する場合は、'.'
に設定します。これは、ワーカーのファイル システムが異なる場合に便利です。
gbPerWorker = 1; job = batch(@hpccBenchmark,1,{gbPerWorker}, ... 'Pool',32, ... 'AttachedFiles',{'hpccRandomNumberGeneratorKernel.mexa64','hpccRandomNumberGeneratorKernel.mexw64','hpccRandomNumberGeneratorKernel.mexmaci64'}, ... 'CurrentFolder','.');
ジョブの投入後、MATLAB での作業を続行できます。ジョブ モニターを使用してジョブの状態を確認できます。[ホーム] タブの [環境] 領域で、[並列]、[ジョブの監視] を選択します。
この例では、ジョブが完了するまで待ちます。クラスターから結果を取得するには、関数 fetchOutputs
を使用します。
wait(job); results = fetchOutputs(job); disp(results{1})
Benchmark DataSizeGB Time Performance PerformanceUnits ______________ __________ ________ ___________ ________________ "HPL" 13.913 113.34 474.69 "GFlops" "DGEMM" 4.6376 41.915 740.99 "GFlops" "STREAM" 5.3333 0.074617 230.24 "GBperSec" "PTRANS" 4.6376 3.7058 1.3437 "GBperSec" "RandomAccess" 8 189.05 0.0056796 "GUPS" "FFT" 4 7.6457 4.9153 "GFlops"
大規模なクラスターを使用する場合は、使用できる計算リソースを増やします。計算に要する時間がワーカー間の通信に要する時間より長い場合、問題を良好にスケール アップできます。次の図に、4
台のマシンからなり、各マシンが 18
個の物理コアをもつクラスターにおける、HPL ベンチマークのスケーリングをワーカー数と共に示します。このベンチマークでは、ワーカー数に伴ってデータ サイズが増加していることがわかります。