Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

HPC チャレンジによるクラスターのベンチマーク

この例では、HPC チャレンジ ベンチマークを使用して計算クラスターのパフォーマンスを評価する方法を説明します。このベンチマークは、異なるメモリ アクセス パターンを測定する複数のテストで構成されます。詳細については、HPC チャレンジ ベンチマークを参照してください。

HPC チャレンジの準備

関数 parpool を使用して、クラスターでワーカーの並列プールを起動します。既定で、parpool は既定のクラスター プロファイルを使用して並列プールを作成します。既定のクラスター プロファイルは、[ホーム] タブの [並列][既定のクラスターの選択] で確認してください。このベンチマークでは、ワーカーは相互に通信します。ワーカー間の通信が最適化されるように、'SpmdEnabled'true に設定します。

pool = parpool('SpmdEnabled',true);
Starting parallel pool (parpool) using the 'MyCluster' profile ...
connected to 64 workers.

関数 hpccDataSizes を使用して、HPC チャレンジの要件を満たす各ベンチマークの問題の規模を計算します。この規模は、ワーカー数および各ワーカーで使用できるメモリ量によって決まります。たとえば、各ワーカーに 1 GB の使用を許可します。

gbPerWorker = 1;
dataSizes = hpccDataSizes(pool.NumWorkers,gbPerWorker);

HPC チャレンジの実行

HPC チャレンジ ベンチマークは複数の部分で構成され、それぞれが異なる観点からシステムのパフォーマンスを調べます。次のコードでは、各関数が 1 つのベンチマークを実行し、パフォーマンス結果を含む 1 行の table を返します。これらの関数は、分散配列に対する様々な演算をテストします。MATLAB は、複数の並列ワーカーにわたって分散配列を分割するため、並列ワーカーはクラスターの結合されたメモリ リソースおよび計算リソースを使用できます。分散配列の詳細については、分散配列を参照してください。

HPL

hpccHPL(m) は Linpack ベンチマークとして知られており、線形方程式系の求解の実行レートを測定します。サイズが mm 列のランダムに分散した実数行列 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) は、実数行列同士の乗算の実行レートを測定します。サイズが mm 列のランダムに分散した実数行列 AB および 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 のランダムに分散したベクトル bc、およびランダムなスカラー 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) は、システムのプロセス間通信の速度を測定します。サイズが mm 列のランダムに分散した 2 つの行列 AB を作成し、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 ベンチマークのスケーリングをワーカー数と共に示します。このベンチマークでは、ワーカー数に伴ってデータ サイズが増加していることがわかります。

参考

|

関連するトピック