HPL 向けアプリケーション・ノート

インテル® oneMKL

この記事は、インテル® ソフトウェア・ネットワークに掲載されている「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 つの方法を説明します。

  1. 最適化されたインテルの HPL バイナリーを直接使用する (mp_inpack)
  2. インテル® MKL で提供されるソースから HPL をビルドし、使用する
  3. インテル® 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 は、以下の方法で入手できます。

インテル® 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 – リファレンス

HPC ソフトウェアおよびアプリケーション

インテル® Xeon® プロセッサーおよびインテル® Itanium® ベースのサーバー (http://www.intel.com/p/en_US/products/server/processor)

✝開発コード名

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

タイトルとURLをコピーしました