インテル® Xeon Phi™ コプロセッサー上で FLOPS 値を計算するには?
この記事は、インテル® デベロッパー・ゾーンに公開されている「Use which hardware PMU events to calculate FLOPS on Intel(R) Xeon Phi(TM) coprocessor?」の日本語参考訳です。
FLOPS 値は、ハイパフォーマンス・コンピューティングで利用される 1 秒あたりの総浮動小数点演算数を意味します。通常インテル® VTune™ Amplifier XE は、命令あたりのクロック数 (平均 CPI) と呼ばれる測定基準を提供します。これは、一般的なプログラムのパフォーマンスを測定します。
この記事では、サンプルプログラム matrix1.c を使って、異なるプラットフォーム向けのコードで FLOPS 値を計算するために使用するイベントを紹介します。
最初に、インテル® C++ コンパイラーのコンパイルオプションで、インテル® Xeon® プロセッサーにはレガシー x87、インテル® SSE、インテル® AVX、インテル® Xeon Phi™ コプロセッサーには 512 ビットのベクトル命令を使用した異なるバイナリーを作成し、次に FLOPS 値を計算するためイベントを収集します。
(ここでは、第 2 世代インテル® Core™ アーキテクチャー 3.4GHz と 64 ビット OS を使用しています。また、インテル® Xeon Phi™ コプロセッサー 1.09GHz を使用します。)
伝統的な FP として X87 OPS を使用して、レガシー X87 命令を使用したバイナリーを生成し、FLOPS 値を計算します
ビルド:
gcc -g –mno-sse matrix1.c -o matrix1.x87
インテル® VTune™ Amplifier XE を実行:
amplxe-cl -collect-with runsa -knob event-config=FP_COMP_OPS_EXE.X87:sa=10000 -- ./matrix1.x87
amplxe-cl –report hw-events
Hardware Event Count: Hardware Event Count: Function Module CPU_CLK_UNHALTED.REF_TSC (K) FP_COMP_OPS_EXE.X87 (K) -------- ----------- ---------------------------- ----------------------- multiply matrix1.x87 36,782,055 2,160,570
FP_COMP_OPS_EXE.X87 は、2,160,570,000 カウントでした。
multiply() の実行時間 = 36,782,055,000 / 3,400,000,000 = 10.818 秒
FLOPS = 2,160,570,000 / 1,000,000 / 10.818 = 199.719Mflopsインテル® C++ コンパイラーの SSE 命令を有効にするオプションで、SSE レジスターを使用し、FLOPS 値を計算します
ビルド:
icc –g –fno-inline –xSSE4.1 matrix1.c –o matrix1.SSE41
インテル® VTune™ Amplifier XE を実行:
amplxe-cl -collect-with runsa -knob event-config=FP_COMP_OPS_EXE.X87:sa=10000 -- ./matrix1.SSE41
amplxe-cl –collect-with runsa -knob event-config= FP_COMP_OPS_EXE.SSE_SCALAR_DOUBLE:sa=10000, FP_COMP_OPS_EXE.SSE_PACKED_DOUBLE:sa=10000 -- ./matrix1.SSE41
amplxe-cl –report hw-events
Hardware Event Count: Hardware Event Count: Hardware Event Count: CPU_CLK_UNHALTED. FP_COMP_OPS_EXE. FP_COMP_OPS_EXE. Function Module REF_TSC (K) SSE_SCALAR_DOUBLE (K) SSE_PACKED_DOUBLE (K) -------- ------------- --------------------- --------------------- --------------------- multiply matrix1.SSE41 1,100,002 0 1,185,800
COMP_OPS_EXE.SSE_PACKED_DOUBLE は、1,185,800,000 カウントでした。
multiply() の実行時間 = 1,100,002,000 / 3,400,000,000 = 0.3235 秒
FLOPS = 1,185,800,000 / 1,000,000 / 0.3235 = 3665.53Mflopsインテル® C++ コンパイラーの AVX 命令を有効にするオプションで、AVX レジスターを使用し、FLOPS 値を計算します
ビルド:
icc -g -fno-inline -xAVX matrix1.c -o matrix1.AVX
インテル® VTune™ Amplifier XE を実行:
amplxe-cl -collect-with runsa -knob event-config=SIMD_FP_256.PACKED_DOUBLE:sa=10000 -- ./matrix1.AVX
amplxe-cl –report hw-events
Hardware Event Count: Hardware Event Count: Function Module CPU_CLK_UNHALTED.REF_TSC (K) SIMD_FP_256.PACKED_DOUBLE (K) -------- ----------- ---------------------------- ----------------------------- multiply matrix1.AVX 1,486,002 777,070
SIMD_FP_256.PACKED_DOUBLE は、777,070,000 カウントでした。
multiply() の実行時間 = 1,486,002,000 / 3,400,000,000 = 0.437 秒
FLOPS = 777,070,000 / 1,000,000 / 0.3235 = 1778.19Mflopsインテル® C++ コンパイラーで 512 ベクトル命令を使用したインテル® Xeon Phi™ コプロセッサーで実行するネイティブプログラムを生成して、FLOPS 値を計算します
ビルド:
icc -g -fno-inline -mmic -O3 matrix1.c -o matrix1.MIC
アプリケーションの FP 演算は、データ並列性を提供するベクトル処理ユニット (VPU) で処理されます。インテル® VTune™ Amplifier XE は、これを監視するイベントをサポートします:
VPU_DATA_READ
VPU_DATA_WRITEインテル® VTune™ Amplifier XE を実行:
amplxe-cl -target-system=mic-native:0 -collect-with runsa -knob event-config=VPU_DATA_READ,VPU_DATA_WRITE -search-dir=. -- /root/matrix1.MIC
amplxe-cl -R hw-events
Hardware Event Count: Hardware Event Count: Hardware Event Count: Function Module VPU_DATA_READ (M) VPU_DATA_WRITE (M) CPU_CLK_UNHALTED (M) -------- ----------- --------------------- --------------------- --------------------- multiply matrix1.MIC 176 134 2,152
VPU_DAT_READ & VPU_DATA_WRITE は、(176+134)=300M カウントでした。
multiply() の実行時間 = 2,152,000,000 / 1,090,000,000 = 1.974 秒
FLOPS = 300,000,000 / 1,000,000 / 0.3235 = 151.97Mflops
この例は、シングルコアで動作するシングルスレッドのアプリケーションであることに注意してください。皆さんは、インテル® Xeon Phi™ コプロセッサーのメニーコア上で動作するマルチスレッドのアプリケーションを開発することができます。
ファイル |
---|
matrix1.c (385 Bytes) (https://software.intel.com/sites/default/files/managed/90/de/matrix1.c) |
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください