インテル® Xeon Phi™ コプロセッサー向けにインテル® MKL の利用モデルを選択する方法

同カテゴリーの次の記事

インテル® MKL におけるインテル® AVX2 向け最適化

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Recommendations to choose the right MKL usage model for Xeon Phi」の日本語参考訳です。


インテル® マス・カーネル・ライブラリー (インテル® MKL) はインテル® Xeon Phi™ コプロセッサーを完全にサポートしており、次のモデルを提供しています。自動オフロードモデルではマルチコアホストとメニーコア・コプロセッサーを同時に使用できます。この記事では、インテル® MKL の各使用モデルについて、データサイズと並列プログラミング/オフロード手法を説明します。

  • 自動オフロード – 透過的にヘテロジニアス・コンピューティングを行います。
  • コンパイラーによるオフロード支援 – オフロードを細かく制御できます。
  • ネイティブ実行 – コプロセッサーを独立したノードとして利用します。

自動オフロード (デフォルトでホストとコプロセッサー (ターゲット) の両方で実行)

サンプル・ビルド・スクリプト: icc –O3 –mkl sgemm.c –o sgemm.exe

自動オフロードは、関数 mkl_mic_enable() を呼び出すか、環境変数 MKL_MIC_ENABLE=1 を設定します。

自動オフロードに対応しているインテル® MKL 関数は以下のとおりです。

  • インテル® MKL の一部の関数が自動オフロードに対応しています。
    • データ転送のオーバーヘッドを相殺するのに十分な計算処理を含む関数でのみ自動オフロードを利用できます。
  • バージョン 11.0 では、次の関数が自動オフロードに対応しています。
    • レベル 3 BLAS: ?GEMM、?TRSM、?TRMM
    • LAPACK 3 amigos: LU、QR、コレスキー分解

このモデルでは、自動的かつ透過的にオフロードを利用できます。

デフォルトでは、オフロードのタイミングおよびホストとターゲット間のワーク分割はインテル® MKL によって決定されます。ただし、パフォーマンスのきめ細かなチューニングのため、ユーザーによるワーク分割の制御が可能です。

自動オフロードは、行列サイズが十分に大きい場合のみ利用できます。

  • ?GEMM: M, N > 2048 の場合のみオフロードします。
  • ?TRSM/TRMM: M, N > 3072 の場合のみオフロードします。
  • 正方行列でよりパフォーマンスが向上する可能性があります。

自動オフロードを無効にするには、次の関数または環境変数のいずれかを使用します。

  • mkl_mic_disable( )
  • mkl_mic_set_workdivision(MIC_TARGET_HOST, 0, 1.0)
  • MKL_HOST_WORKDIVISION=100

コンパイラーによるオフロード支援

サンプル・ビルド・スクリプト: 次のように -offload-option を指定してビルドします。

icc –O3 -openmp -mkl \
  –offload-option,mic,ld, “-L$MKLROOT/lib/mic -Wl,\
  –start-group -lmkl_intel_lp64 -lmkl_intel_thread \
  -lmkl_core -Wl,–end-group” sgemm.c –o sgemm.exe

  • コンパイラーのプラグマ/宣言子により、オフロードを明示的に制御します。
  • すべてのインテル® MKL 関数をオフロードすることができます。
    • 一部のインテル® MKL 関数でのみ利用可能な自動オフロードとは対照的です。
  • コンパイラーのオフロード機能を最大限に活用できます。
  • より柔軟なデータ転送とリモート実行管理が可能です。
    • データ保持という優れた利点により、複数の処理で転送されたデータを再利用できます。

コンパイラーによるオフロード支援は、データ保持により利点がもたらされるパイプライン処理に最適です。

     __declspec(target(mic)) static float *A, *B, *C, *C1; 

     // 行列 A、B、C をコプロセッサーへ転送し、行列 A と B の割り当てを解放しないようにします。
     #pragma offload target(mic) \  
     in(transa, transb, M, N, K, alpha, beta, LDA, LDB, LDC) \ 
     in(A:length(NCOLA * LDA) free_if(0)) \    
     in(B:length(NCOLB * LDB) free_if(0)) \    
     inout(C:length(N * LDC))
     {   
         sgemm(&transa, &transb, &M, &N, &K, &alpha, A, &LDA, B, &LDB, &beta, C, &LDC);
     } 

     // 行列 C1 をコプロセッサーへ転送し、行列 A と B は再利用します。
     #pragma offload target(mic) \  
     in(transa1, transb1, M, N, K, alpha1, beta1, LDA, LDB, LDC1) \ 
     nocopy(A:length(NCOLA * LDA) alloc_if(0) free_if(0)) \    
     nocopy(B:length(NCOLB * LDB) alloc_if(0) free_if(0)) \    
     inout(C1:length(N * LDC1))
     {   
         sgemm(&transa1, &transb1, &M, &N, &K, &alpha1, A, &LDA, B, &LDB, &beta1, C1, &LDC1);
     } 

     // コプロセッサー上の行列 A と B の割り当てを解放します。
     #pragma offload target(mic) \  
     nocopy(A:length(NCOLA * LDA) free_if(1)) \
     nocopy(B:length(NCOLB * LDB) free_if(1)) \  {  }
      

コンパイラーによるオフロード支援のヒント

データ保持により不要なデータコピーとメモリー割り当て/解放を排除します。

  • スレッド・アフィニティー: OS コアの使用は避けてください。例えば、60 コアのコプロセッサーでは次のように設定します。
    MIC_KMP_AFFINITY=explicit,granularity=fine,proclist=[1-236:1]
  • ユーザーコードでラージ (2MB) メモリーページを割り当てます。例えば、次のように設定します。
  • MIC_USE_2MB_BUFFERS=64K
  • MIC_USE_2MB_BUFFERS の値がしきい値になります。この例では 64KB 以上がラージページとして割り当てられます。

ネイティブ

サンプル・ビルド・スクリプト:

次のように –mmic を指定してビルドします。

icc –O3 –mmic -mkl sgemm.c –o sgemm.exe

  • –mmic オプションを指定してビルドすると、コプロセッサー上でのみ実行するプログラムが生成されます。
  • ネイティブ実行モデルでインテル® MKL を使用する場合のヒント:
  • 最良のパフォーマンスを達成できるようにすべてのスレッドを使用します。例えば、60 コアのコプロセッサーの場合は、次のように設定します。
    MIC_OMP_NUM_THREADS=240
  • スレッド・アフィニティーの設定
    KMP_AFFINITY=explicit,proclist=[1-240:1,0,241,242,243],granularity=fine

ラージページを使ってメモリーを割り当てます。

適切なモデルの選択

次の場合は、ネイティブ実行モデルを選択します。

高度な並列性を備えたコード

  • コプロセッサーを独立した計算ノードとして使用する場合

次の場合は、自動オフロードモデルを選択します。

  • 十分なバイト/FLOP の比率によりオフロードの利点が得られる場合
  • レベル 3 BLAS 関数 (?GEMM、?TRMM、?TRSM) を使用する場合
  • LU、QR、コレスキー分解を使用する場合

次の場合は、コンパイラーによるオフロード支援を選択します。

  • データ転送のオーバーヘッドを相殺するのに十分な計算処理がある場合
  • 転送データを複数の処理で再利用できる場合

オフロードによってパフォーマンスの向上が得られない場合は、常にホストで実行することができます。

インテル® Xeon Phi™ コプロセッサー向けに最適化されているインテル® MKL 関数

次のコンポーネントは、インテル® Xeon Phi™ コプロセッサー向けに最適化されています。

  • すべてのレベル 3 BLAS と一部のレベル 1 およびレベル 2 BLAS
  • スパース BLAS: ?CSRMV、?CSRMM
  • LU、コレスキー、QR 分解
  • FFT: 1D/2D/3D、SP と DP、r2c、c2c
  • VML (浮動小数点関数)
  • 乱数ジェネレーター:
    • MT19937、MT2203、MRG32k3a
    • 離散一様分布と幾何学

コードサンプル

$MKLROOT/examples/mic_samples

  • ao_sgemm        自動オフロードのサンプル
  • dexp                VML サンプル (vdExp)
  • dgaussian         倍精度ガウス乱数
  • fft                    複素数-複素数 1D FFT
  • sexp                VML サンプル (vsExp)
  • sgaussian         単精度ガウス乱数
  • sgemm             SGEMM サンプル
  • sgemm_f          SGEMM サンプル (Fortran 90)
  • sgemm_reuse    データ保持を利用する SGEMM
  • sgeqrf              QR 分解
  • sgetrf               LU 分解
  • spotrf              コレスキー分解
  • solverc             PARDISO サンプル

関連するその他の記事については、「インテル® メニー・インテグレーテッド・コア・アーキテクチャー(インテル® MIC アーキテクチャー)上のインテル® マス・カーネル・ライブラリー(インテル® MKL) 関連記事」をご覧ください。

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

関連記事