マルチコア・パフォーマンスの管理

スレッドを処理するコアが変更されないようにすることで、マルチコア・プロセッサーのシステムで最良のパフォーマンスを得ることができます。 このためには、スレッドにアフィニティー・マスクを設定し、スレッドと 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. 無断での引用、転載を禁じます。