スレッドを処理するコアが変更されないようにすることで、マルチコア・プロセッサーのシステムで最良のパフォーマンスを得ることができます。 このためには、スレッドにアフィニティー・マスクを設定し、スレッドと CPU コアをバインドします。 以下のいずれかのオプションを入力します。
以下のパフォーマンス問題について考えてみます。
以下のコードサンプルは、オペレーティング・システムでアフィニティー・マスクを設定してこの問題を解決する方法を示しています。このコードは、システム関数 sched_setaffinity を呼び出して異なるソケットのコアにスレッドをバインドします。 その後、インテル® MKL FFT 関数が呼び出されます。
#define _GNU_SOURCE // GNU CPU アフィニティーを使用します。 // (適切なカーネルと glibc を使用) // アフィニティー・マスクを設定します。 #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 パッケージ x 2 コア/パッケージ x 1 スレッド/コア (4 コア) 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)); } // インテル® MKL FFT ルーチンを呼び出します。 return 0; }
インテル® コンパイラーで、以下のコマンドを使用してアプリケーションをコンパイルします。
icc test_application.c -openmp
test_application.c は、アプリケーションのファイル名です。
アプリケーションをビルドします。例えば、次のように環境変数を使用してスレッド数を設定し、ビルドしたアプリケーションを 2 スレッドで実行します。
env OMP_NUM_THREADS=2 ./a.out
上記の例で使用されている sched_setaffinity 関数の詳細については、Linux プログラマーズ・マニュアル (man ページ形式) を参照してください。
© 2006 - 2010 Intel Corporation. 無断での引用、転載を禁じます。