この記事は、インテル® ソフトウェア・ネットワークに掲載されている「HPL application note」(http://software.intel.com/en-us/articles/performance-tools-for-software-developers-hpl-application-note/) の日本語参考訳です。
ステップ 1 – 概要
このガイドは、現在 HPL を使用しているユーザーが、より優れたベンチマーク結果を得られるように、インテル® マス・カーネル・ライブラリー (インテル® MKL) の BLAS を利用する手順を説明します。
HPL (High Performance LINPACK) は HPC の業界標準ベンチマークで、分散メモリー・コンピューター上で倍精度 (64 ビット) の (ランダムで) 稠密な連立線形方程式を解くソフトウェア・パッケージです。
ここでは、HPL を実行する 3 つの方法を説明します。
- 最適化されたインテルの HPL バイナリーを直接使用する (mp_inpack)
- インテル® MKL で提供されるソースから HPL をビルドし、使用する
- インテル® MKL とリンクしてオープンソースの HPL をビルドし、使用する
バージョン情報
このアプリケーション・ノートは、Linux* プラットフォーム上でインテル® MKL の最新バージョンと HPL を使用してクラスターのベンチマークを行うユーザー向けに作成されました。ここでは、インテル® MKL 10.3 について説明します。
ステップ 2 – HPL ソースコードのダウンロード
オープンソースの HPL をダウンロードします。
インテル® MKL がインストールされている場合は、以下のインテル® MKL のサブディレクトリーに HPL があります。
/benchmarks/mp_linpack
必要条件
1. BLAS
BLAS (Basic Linear Algebra Subprograms) の DGEMM は、HPL により実行される主要なハイパフォーマンス・ルーチンです。インテル® MKL の BLAS は、インテル® Xeon® プロセッサー・ベースのシステム上でパフォーマンスを最大限に引き出せるよう最適化されています。
インテル® MKL の BLAS は、以下の方法で入手できます。
- A.インテル® MKL 製品の無料評価版をダウンロードする
- B.インテル® MKL 製品の無料非商用版をダウンロードする
インテル® MKL は次の製品にもバンドルされています。
インテル® Optimized LINPACK Benchmark パッケージ (無料)
インテル® MKL の BLAS を含む LINPACK ベンチマークのバイナリー実装である、インテル® Optimized LINPACK Benchmark パッケージ (http://software.intel.com/en-us/articles/intel-math-kernel-library-linpack-download/) が無料で提供されています。これらの SMP および分散メモリーパッケージは、HPL よりも簡単に使用できます (コンパイルは不要で、バイナリーを実行するだけです)。HPL ユーザーは HPL からインテル® Optimized LINPACK Benchmark パッケージへ移行することを強く推奨します。
2. MPI
インテル® MPI またはオープンソースの MPI (MPICH2) をダウンロードします。
インテル® Optimized LINPACK Benchmark パッケージのビルド済みバイナリーを実行するか、次のステップに従って HPL をビルドして実行します。パッケージには、HPL バイナリーのハイブリッド (mpi + openmp) 並列バージョンも含まれています。
インテル® MKL に含まれる HPL ソースをビルドする場合は、次のステップ 3 と 4 をスキップしてください。IA-32 およびインテル® 64 プラットフォーム用に 2 つの makefile (Make.ia32 と Make.intel64) が提供されています。これらの makefile を使って、HPL のシリアルバージョンまたは並列バージョンのどちらでもビルドできます。
(netlib から) hpl-2.0.tar.gz をダウンロードした場合は、次の操作を行ってください。
ステップ 3 – 設定
1) tar ファイルを展開します。
次のコマンドを使ってダウンロードした hpl-2.0.tar.gz ファイルを展開します。
$gunzip hpl-2.0.tar.gz $tar -xvf hpl-2.0.tar.
これにより、hpl ディレクトリーが作成されます (以下の説明では、このディレクトリーをトップレベルのディレクトリーと呼びます)。
2) makefile の作成
トップレベルのディレクトリーに Make. ファイルを作成します。セットアップ・ディレクトリー (hpl/setup/) にあるものを再利用することもできます。ここでは Make.Linux_PII_CBLAS を使用します。このファイルには、使用するコンパイラーとライブラリーのパスが含まれています。
このファイルをコピーします。
$cp hpl-2.0/setup/Make.Linux_PII_CBLAS hpl
このファイルの名前を変更します。
$mv Make.Linux_PII_CBLAS Make.intel64
このアプリケーション・ノートでは、インテル® 64 プラットフォーム向けの HPL のビルド方法を説明します。
インテル® C++ および FORTRAN コンパイラーがインストールされ、PATH 変数に設定されていることを確認してください。また、LD_LIBRARY_PATH にコンパイラー (C++ および FORTRAN)、MPI、および MKL ライブラリーのパスを設定します。
ステップ 4 – Makefile の変更
以下に HPL のビルド手順を示します。
Make.intel64 を編集します。
1) ARCH の値を intel64 ( の値) に変更します。
# ---------------------------------------------------------------------- # - Platform identifier ------------------------------------------------ # ---------------------------------------------------------------------- # ARCH = intel64
2) MPI ライブラリーを指定します。
MPdir = /opt/intel/mpi MPinc = -I$(MPdir)/include64 MPlib = $(MPdir)/lib64/libmpi_mt.a
ここでは、MPI ライブラリーのマルチスレッド・バージョンを指定しています。
gnu MPI (MPICH2) を使用する場合は、libmpi.a の代わりに libmpich.a を指定します。
より優れたパフォーマンスを引き出すために、インテル® MPI の使用を推奨します。
3) 算術ライブラリー (インテル® MKL) を指定します。
LAdir = /opt/intel/mk/lib/intel64 LAinc = /opt/intel/mkl/include LAlib = -Wl,--start-group $(LAdir)/libmkl_intel_lp64.a $(LAdir)/libmkl_intel_thread.a $(LAdir)/libmkl_core.a -Wl, --end-group -lpthread -lm
4) OpenMP* を含めるようにコンパイラー・オプションを変更します。
CCFLAGS に以下を追加します。
-openmp
ステップ 5 – HPL のビルド
実行ファイルをビルドするには “make arch=” を使用します。bin/ ディレクトリーに xhpl という実行ファイルが作成されます。
ここでは、次のコマンドを実行します。
$make arch=intel64
実行ファイル bin/intel64/xhpl と、 HPL 設定ファイル HPL.dat が作成されます。
通常、実行にはスクリプトが必要です。readme ファイルの一部も転載したほうが良いでしょう。
さらに、コンパイラーのコマンドライン構文などもリストします。
ステップ 6 – HPL の実行
ケース 1: インテル® Optimized LINPACK をダウンロードした場合
パッケージを展開し、プラットフォーム用のスクリプトを実行します。
例: インテル® Xeon® プロセッサーを搭載したインテル® 64 ベースのマシンでハイブリッド HPL を実行する場合
$runme_hybrid_inte64
詳細は、パッケージに付属の lpk_notes_lin.htm を参照してください。
ケース 2 & 3: インテル® MKL またはオープンソースの HLP から から HLP をビルドした場合
実行ファイルをビルドしたディレクトリーに移動します。
例えば、HLP のテスト実行には、次のコマンドを使用します。
$cd bin/ $mpirun -np 4 xhpl
ノード名を使用してマシンファイルを作成します。
front-end-0 compute-0 compute-1 ..................... ..................... compute-128
マシンファイルを使用して実行します。
$mpirun -np 8 -nodes 4 -machinefile machines xhpl
その他の引数については、MPI のドキュメントを参照してください。
チューニング:
パフォーマンス引数のほとんどは、入力ファイル bin/HPL.dat を変更してチューニングできます。詳細は、トップレベルのディレクトリーにある TUNING ファイルを参照してください。
注: インテル® Optimized LINPACK を使用する場合は、パッケージに付属の入力ファイル (例えば、HPL_hybrid.dat) を変更する必要があります。入力ファイルの変更に関する詳細は、拡張ヘルプ xhelp.lpk を参照してください。
HPL 実行中に考慮すべき主要な引数
問題サイズ (N): 問題サイズは、最高のパフォーマンスが得られるように、メモリーに収まる最大サイズにすべきです。例えば、10 ノード、1GB RAM の場合、メモリーの合計サイズは 10GB です。つまり、1342M 近くの倍精度要素があります。この平方根は 36635 です。オペレーティング・システムなどのために、一定のメモリーを残しておく必要があります。通常、メモリーの合計の 80% が問題サイズの開始ポイントになります (つまり、この例では 33000)。問題サイズが大きすぎると、スワップアウトされ、パフォーマンスが低下します。
ブロックサイズ (NB): HPL は、データの分散と計算の粒度にブロックサイズ NB を使用します。NB が小さすぎると、データが再利用されないため計算パフォーマンスが制限され、メッセージ数が増加します。「適切な」ブロックサイズはほとんどの場合 [32 .. 256] の間で、キャッシュサイズに依存します。IA-32 では 80-216、IA-64 3M キャッシュでは 128-192、IA-64 4M キャッシュでは 400、Woodcrest✝ では 130 が適切なブロックサイズであることが分かっています。
プロセスグリッド比 (PXQ): これは、物理的な相互接続ネットワークに依存します。P と Q はほぼ同じにし、Q のほうが P よりもわずかに大きくなるようにすべきです。例えば、480 プロセッサー・クラスターの場合、20X24 は良い比率といえます。
ヒント: マシンファイルのノードの順序を変更し、パフォーマンスが向上するかどうか確認してみると良いでしょう。最高のパフォーマンスを得るために、試行錯誤アプローチにより上記のすべての引数を使用してみてください。
また、クラスター上でベンチマークを実行する前に、PHP Web ツールを使用し、システム要件を入力して、HPL ファイルの最適な入力引数のアドバイスを得ることもできます。このツールは、次の SourceForge の Web サイトから利用できます。
http://hpl‐calculator.sourceforge.net (英語)
付録 A – パフォーマンス比較
以下は、シリアルバージョンの HPL をインテル® Xeon® プロセッサー X5670 番台 (Westmere✝) で実行した結果です。
ハードウェア構成
プロセッサー: インテル® Xeon プロセッサー X5670 番台 (Westmere✝) 2.93GHz/6.4 QPI 1333 95 W、32KB L1/256KB L2/12MB L3 キャッシュ
RAM: 合計 24GB/ノード (6*4GB 1333MHz)
プロセッサー数: 4320
チップあたりのコア数: 6
理論的なピーク: 50.6304 TFlops/秒
メモリーの合計: 8640GB
ソフトウェア構成
インテル® コンパイラー 11.1
インテル® MPI.4.0
インテル® MKL10.3
HPL: |
43.722 Tflop/秒 |
HPL time: |
14002.6 |
|
HPL eps: |
2.22045e-16 |
HPL Rnorm1: |
0.000000140367 |
|
HPL Anorm1: |
243723 |
HPL AnormI: |
243671 |
|
HPL Xnorm1: |
1011140 |
HPL XnormI: |
6.36053 |
|
HPL N: |
972000 |
HPL NB: |
168 |
|
HPL NProw: |
60 |
HPL NPcol: |
72 |
|
HPL depth: |
0 |
HPL NBdiv: |
2 |
|
HPL NBmin: |
4 |
HPL CPfact: |
R |
|
HPL CRfact: |
C |
HPL CPtop: |
1 |
|
HPL order: |
R |
|
|
|
HPL dMach EPS: |
2.220446e-16 |
HPL sMach EPS: |
0.0000001192093 |
|
HPL dMach sfMin: |
2.2250739999999997e-308 |
HPL sMach sfMin: |
1.1754939999999999e-38 |
|
HPL dMach Base: |
2 |
HPL sMach Base: |
2 |
|
HPL dMach Prec: |
4.440892e-16 |
HPL sMach Prec: |
0.0000002384186 |
|
HPL dMach mLen: |
53 |
HPL sMach mLen: |
24 |
|
HPL dMach Rnd: |
0 |
HPL sMach Rnd: |
0 |
|
HPL dMach eMin: |
-1021 |
HPL sMach eMin: |
-125 |
|
HPL dMach rMin: |
2.2250739999999997e-308 |
HPL sMach rMin: |
1.1754939999999999e-38 |
|
HPL dMach eMax: |
1025 |
HPL sMach eMax: |
129 |
|
HPL dMach rMax: |
0 |
HPL sMach rMax: |
0 |
|
dweps: |
1.110223e-16 |
sweps: |
0.00000005960464 |
付録 B – 既知の問題点と制限事項
インテル® Optimized LINPACK のバイナリーを使用せずにビルドする場合は、MPI が正しく実行され、LD_LIBRARY_PATH に Fortran、C++、MPI、インテル® MKL ライブラリーのパスが設定され、PATH に Fortran、C++、MPI バイナリーのパスが設定されていることを確認してください。
付録 C – リファレンス
インテル® Xeon® プロセッサーおよびインテル® Itanium® ベースのサーバー (http://www.intel.com/p/en_US/products/server/processor)
✝開発コード名
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。