インテル® MKL 2017 デベロッパー・ガイド
スレッドを処理するコアが変更されないようにすることで、マルチコア・プロセッサーのシステムで最良のパフォーマンスを得ることができます。このためには、スレッドにアフィニティー・マスクを設定し、スレッドと CPU コアをバインドします。以下のいずれかのオプションを使用します。
以下のパフォーマンス問題について考えてみます。
この問題を解決するには、インテル® MKL を呼び出す前に、KMP_AFFINITY 環境変数や sched_setaffinity システム関数を使用して、各 OpenMP* スレッドのアフィニティー・マスクを設定します。以下のコードサンプルは、オペレーティング・システムでアフィニティー・マスクを設定してこの問題を解決する方法を示しています。このコードは、システム関数 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、インテル® ストリーミング SIMD 拡張命令 3、インテル® ストリーミング SIMD 拡張命令 3 補足命令などの最適化が該当します。インテルは、他社製マイクロプロセッサーに関して、いかなる最適化の利用、機能、または効果も保証いたしません。本製品のマイクロプロセッサー依存の最適化は、インテル® マイクロプロセッサーでの使用を前提としています。インテル® マイクロアーキテクチャーに限定されない最適化のなかにも、インテル® マイクロプロセッサー用のものがあります。この注意事項で言及した命令セットの詳細については、該当する製品のユーザー・リファレンス・ガイドを参照してください。 注意事項の改訂 #20110804 |