マルチコアのパフォーマンスを管理

スレッドを処理するコアを固定することで、マルチコア・プロセッサーのシステムで最良のパフォーマンスを得ることができます。それには、スレッドにアフィニティー・マスクを設定し、スレッドと CPU コアをバインドします。以下のいずれかのオプションを使用します。

以下のパフォーマンス問題について考えてみます。

この問題を解決するには、インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) を呼び出す前に、KMP_AFFINITY 環境変数や SetThreadAffinityMask システム関数を使用して、OpenMP* スレッドのアフィニティー・マスクを設定します。 次の例は、インテル® コンパイラーを使用してオペレーティング・システムでアフィニティー・マスクを設定することで問題を解決する方法を示しています。コードは SetThreadAffinityMask 関数を呼び出してスレッドを適切なコアにバインドし、スレッドの移動を防止します。 次に、インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) の LAPACK ルーチンが呼び出されます。

// アフィニティー・マスクを設定 
#include <windows.h> 
#include <omp.h> 

int main(void) { 
#pragma omp parallel default(shared) 
  { 
  int tid = omp_get_thread_num(); 
  // 2 パッケージ x 2 コア/パッケージ x 1 スレッド/コア (合計 4 コア) 
  DWORD_PTR mask = (1 << (tid == 0 ? 0 : 2 )); 
  SetThreadAffinityMask( GetCurrentThread(), mask ); 
  }
   // MKL LAPACK の呼び出し
  routine return 0; 
}  

インテル® コンパイラーで、以下のコマンドを使用してアプリケーションをコンパイルします。

icx /Qopenmp test_application.c

test_application.c は、アプリケーションのソースファイル名です。

アプリケーションをビルドします。例えば、次のように環境変数にスレッド数を設定し、ビルドしたアプリケーションを 4 スレッドで実行します。

set OMP_NUM_THREADS=4 test_application.exe

Windows* API ルーチンの使用に関する制限と、上記の例で使用されている SetThreadAffinityMask 関数の詳細については、msdn.microsoft.com/ の Windows* API ドキュメントを参照してください。 

en.wikipedia.org/wiki/Affinity_mask にも同様の例があります。

製品および性能に関する情報

性能は、使用状況、構成、およびその他の要因によって異なります。詳細については、www.Intel.com/PerformanceIndex (英語) をご覧ください。

改訂 #20201201