この質問は、2つのプロセスが同じCPUで実行されるようにすることについて質問します。を使用sched_setaffinity
すると、プロセスを多数の論理CPUに制限できますが、これらが特定の物理CPUおよびスレッドにマップされていることを確認するにはどうすればよいですか?
マッピングは次のようになると思います。
0-CPU0スレッド
01-CPU0スレッド
12-CPU1スレッド03
-CPU1スレッド1
など..
ここで、左側の数字はで使用されている関連CPUsched_setaffinity
です。
しかし、私がこれをテストしようとしたとき、これは必ずしもそうではないように見えました。
これをテストするためCPUID
に、現在のコアの初期APICIDをEBX
次の場所に返す命令を使用しました。
void print_cpu()
{
int cpuid_out;
__asm__(
"cpuid;"
: "=b"(cpuid_out)
: "a"(1)
:);
std::cout << "I am running on cpu " << std::hex << (cpuid_out >> 24) << std::dec << std::endl;
}
次に、CPUマスクのビットをループして、一度に1つずつ設定し、OSがプロセスを各論理CPUに順番に移行するようにしてから、現在のCPUを出力しました。
これは私が得たものです:
cpu mask is 0
I am running on cpu 0
cpu mask is 1
I am running on cpu 4
cpu mask is 2
I am running on cpu 2
cpu mask is 3
I am running on cpu 6
cpu mask is 4
I am running on cpu 1
cpu mask is 5
I am running on cpu 5
cpu mask is 6
I am running on cpu 3
cpu mask is 7
I am running on cpu 7
CPUが上記のスキームに従って初期APICIDを割り当てると仮定すると、cpuマスクは実際には物理コアとスレッドに対応していないように見えます。
sched_setaffinity
マスク内のビットの物理コアへの正しいマッピングを見つけるにはどうすればよいですか?