インテル® Xeon Phi™ コプロセッサー上で FLOPS 値を計算するには?

同カテゴリーの次の記事

インテル® コンパイラー 15.0 最適化 クイック・リファレンス・ガイド 日本語版を公開

この記事は、インテル® デベロッパー・ゾーンに公開されている「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 を使用します。)

  1. 伝統的な 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

  2. インテル® 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

  3. インテル® 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

  4. インテル® 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)

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

関連記事