インテル® マス・カーネル・ライブラリー 11.2 ユーザーズガイド
スレッドを処理するコアが変更されないようにすることで、マルチコア・プロセッサーのシステムで最良のパフォーマンスを得ることができます。このためには、スレッドにアフィニティー・マスクを設定し、スレッドと CPU コアをバインドします。以下のいずれかのオプションを入力します。
以下のパフォーマンス問題について考えてみます。
以下のコードサンプルは、オペレーティング・システムでアフィニティー・マスクを設定してこの問題を解決する方法を示しています。このコードは、システム関数 sched_setaffinity を呼び出して異なるソケットのコアにスレッドをバインドし、その後、インテル® MKL FFT 関数が呼び出されます。
#define _GNU_SOURCE //for using the GNU CPU affinity // (works with the appropriate kernel and glibc) // Set affinity mask #include <sched.h> #include <stdio.h> #include <unistd.h> #include <omp.h> int main(void) { int NCPUs = sysconf(_SC_NPROCESSORS_CONF); printf("Using thread affinity on %i NCPUs\n", NCPUs); #pragma omp parallel default(shared) { cpu_set_t new_mask; cpu_set_t was_mask; int tid = omp_get_thread_num(); CPU_ZERO(&new_mask); // 2 packages x 2 cores/pkg x 1 threads/core (4 total cores) CPU_SET(tid==0 ? 0 : 2, &new_mask); if (sched_getaffinity(0, sizeof(was_mask), &was_mask) == -1) { printf("Error: sched_getaffinity(%d, sizeof(was_mask), &was_mask)\n", tid); } if (sched_setaffinity(0, sizeof(new_mask), &new_mask) == -1) { printf("Error: sched_setaffinity(%d, sizeof(new_mask), &new_mask)\n", tid); } printf("tid=%d new_mask=%08X was_mask=%08X\n", tid, *(unsigned int*)(&new_mask), *(unsigned int*)(&was_mask)); } // Call Intel MKL FFT function return 0; }
インテル® コンパイラーで、以下のコマンドを使用してアプリケーションをコンパイルします。
icc test_application.c -openmp
test_application.c は、アプリケーションのファイル名です。
アプリケーションをビルドします。例えば、次のように環境変数を使用してスレッド数を設定し、ビルドしたアプリケーションを 2 スレッドで実行します。
env OMP_NUM_THREADS=2 ./a.out
上記の例で使用されている sched_setaffinity 関数の詳細については、Linux* プログラマーズ・マニュアル (man ページ形式) を参照してください。
インテル® コンパイラーは、互換マイクロプロセッサー向けには、インテル製マイクロプロセッサー向けと同等レベルの最適化が行われない可能性があります。これには、インテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2)、インテル® ストリーミング SIMD 拡張命令 3 (インテル® SSE3)、ストリーミング SIMD 拡張命令 3 補足命令 (SSSE3) 命令セットに関連する最適化およびその他の最適化が含まれます。インテルでは、インテル製ではないマイクロプロセッサーに対して、最適化の提供、機能、効果を保証していません。本製品のマイクロプロセッサー固有の最適化は、インテル製マイクロプロセッサーでの使用を目的としています。インテル® マイクロアーキテクチャーに非固有の特定の最適化は、インテル製マイクロプロセッサー向けに予約されています。この注意事項の適用対象である特定の命令セットの詳細は、該当する製品のユーザー・リファレンス・ガイドを参照してください。 改訂 #20110804 |