インテル® MKL 11.3 ユーザーズガイド
スレッドを処理するコアが変更されないようにすることで、マルチコア・プロセッサーのシステムで最良のパフォーマンスを得ることができます。このためには、スレッドにアフィニティー・マスクを設定し、スレッドと CPU コアをバインドします。以下のいずれかのオプションを使用します。
以下のパフォーマンス問題について考えてみます。
この問題を解決するには、インテル® MKL を呼び出す前に、KMP_AFFINITY 環境変数や SetThreadAffinityMask システム関数を使用して、各 OpenMP* スレッドのアフィニティー・マスクを設定します。 以下のコードサンプルは、オペレーティング・システムでアフィニティー・マスクを設定してこの問題を解決する方法を示しています。このコードは、システム関数 SetThreadAffinityMask を呼び出して適切なコアにスレッドをバインドし、スレッドを処理するコアが変更されないようにします。 その後、インテル® MKL LAPACK ルーチンが呼び出されます。
// Set affinity mask #include <windows.h> #include <omp.h> int main(void) { #pragma omp parallel default(shared) { int tid = omp_get_thread_num(); // 2 packages x 2 cores/pkg x 1 threads/core (4 total cores) DWORD_PTR mask = (1 << (tid == 0 ? 0 : 2 )); SetThreadAffinityMask( GetCurrentThread(), mask ); } // Call Intel MKL LAPACK routine return 0; }
インテル® コンパイラーで、以下のコマンドを使用してアプリケーションをコンパイルします。
icl /Qopenmp test_application.c
test_application.c は、アプリケーションのファイル名です。
アプリケーションをビルドします。例えば、次のように環境変数を使用してスレッド数を設定し、ビルドしたアプリケーションを 4 スレッドで実行します。
set OMP_NUM_THREADS=4 test_application.exe
Windows* API ルーチンの使用における制限と上記の例で使用されている SetThreadAffinityMask 関数の詳細については、Windows API ドキュメント (msdn .microsoft .com/) を参照してください。
en.wikipedia.org/wiki/Affinity_mask (英語) の例も参照してください。
インテル® コンパイラーは、互換マイクロプロセッサー向けには、インテル製マイクロプロセッサー向けと同等レベルの最適化が行われない可能性があります。これには、インテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2)、インテル® ストリーミング SIMD 拡張命令 3 (インテル® SSE3)、ストリーミング SIMD 拡張命令 3 補足命令 (SSSE3) 命令セットに関連する最適化およびその他の最適化が含まれます。インテルでは、インテル製ではないマイクロプロセッサーに対して、最適化の提供、機能、効果を保証していません。本製品のマイクロプロセッサー固有の最適化は、インテル製マイクロプロセッサーでの使用を目的としています。インテル® マイクロアーキテクチャーに非固有の特定の最適化は、インテル製マイクロプロセッサー向けに予約されています。この注意事項の適用対象である特定の命令セットの詳細は、該当する製品のユーザー・リファレンス・ガイドを参照してください。 改訂 #20110804 |