スレッドを処理するコアを固定することで、マルチコア・プロセッサーのシステムで最良のパフォーマンスを得ることができます。それには、スレッドにアフィニティー・マスクを設定し、スレッドと 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 |