2

GOMP_CPU_AFFINITYがスレッドを特定のコアにバインドすることは知っています。

しかし、彼らがここで与えた例では、次のようになります。

GOMP_CPU_AFFINITY="0 3 2 1"

ここ、

thread0がアタッチされます---> cpu0

thread1がアタッチされます---> cpu3

thread2がアタッチされます---> cpu2

thread3がアタッチされます---> cpu1

これは明らかです。

しかし、どうすればthread0をcore0とcore2に同時に設定できますか? そのための環境変数「GOMP_CPU_AFFINITY」の値はどうなりますか?

4

2 に答える 2

4

このGOMP リファレンスが役立つ場合があります。特定の質問に答えるには、 `GOMP_CPU_AFFINITY="0-2:2 ..." とします。これは、「2 (0 と 2) で割り切れる任意のプロセッサ 0-2 で実行する」ことを意味します。

少なくとも、core0 または core2 のいずれかで thread0 を実行する方法を尋ねている場合、実際に尋ねる質問には「できません」という答えがあります。スレッドは、正確な瞬間に 1 つのコアでしか実行できないためですであるため、Thread0 は 2 つのコアで同時に実行できません。

于 2012-12-27T09:44:17.090 に答える
1

CPU 0 と 2 は、CPU 1 と 3 と同様に、同じ物理コアのハイパースレッドであると推測します。Intel の OpenMP ライブラリでは、次のような設定で、各スレッドを両方のハイパースレッドにバインドできます。

KMP_AFFINITY="granularity=core,compact"

残念ながら、GCC ( 経由libgomp) も Sun/Solaris Studio も、1 対多または多対多のスレッドと CPU のバインド スタイルをサポートしていません。GOMP_CPU_AFFINITY(GCC) または(Sun/Solaris Studio) を設定SUNW_MP_PROCBINDすると、各スレッドを特定の CPU にバインドできますが、CPU のセットにはバインドできません。

Intel OpenMP がサポートするものと同様のバインディング スタイルをサポートしない OpenMP ランタイムでは、各スレッドのアフィニティ マスクを変更するために、代わりに OS スケジューラ呼び出しを使用できます。これにより、移植性のないアプリケーションが作成されますが、1 対多のバインディング スタイルを実現できます。Linux では、必要なスケジューラ呼び出しはsched_getaffinity(2)sched_setaffinity(2)です。

于 2012-12-27T16:52:24.673 に答える