2011-11-30 17 views

答えて

13

はい、名前の呼び出しは、スレッドアフィニティを設定していきます。唯一の問題は、スレッド番号を修正し、正しいスレッドで正しいアフィニティを設定することです(既知のスレッド数に対してforループの静的スケジューリングを試すことができます)。

私が知っているように、ほとんどすべてのopenmpでは、環境によってアフィニティを設定できます。環境変数の名前はさまざまです(これは以前のところ、それは問題にはなっていませんでした)。 http://www.spec.org/omp2001/results/omp2001.htmlページを使用してopenMPの実装を見つけ、特定の環境変数名を検索します。親和性はspecOMP結果の約半分に設定されます。結果にはさらにいくつかのOpenMPパフォーマンスチューニング設定があります。

など。 For intel compiler変数である63

そしてnewer OpenMP Standard, version 3.1環境変数OMP_PROC_BINDを(0から数えて)最大CPUの数を定義され

export KMP_AFFINITY=compact,0 

For sun compiler:

export SUNW_MP_PROCBIND=TRUE 

For gcc (pre-openmp 3.1)

export GOMP_CPU_AFFINITY=0-63 

(セクションを参照してください4.4)、これはOpenMPで親和性を設定する標準化された方法です。使用法:

export OMP_PROC_BIND=true 
+0

ありがとうございます! 'pthread_attr_setaffinity_np'のように、言語レベルでは何もありません。 –

+0

いいえ、openmp標準にはスレッドバインディングプラグマまたは関数がありません。唯一の方法(および推奨される方法)は、環境変数、コンパイラ固有またはopenmp3.1を介してスレッドをバインドすることです。この設定は、メインを開始する前に早めに行う必要があります。 – osgx

+0

厳密に言えば、答えは「いいえ」で始まるはずです:) –