3

この質問は、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マスク内のビットの物理コアへの正しいマッピングを見つけるにはどうすればよいですか?

4

1 に答える 1

2

hwlocは、ハードウェア/NUMA トポロジを検出し、プロセス/スレッドを特定のコアにバインドするための移植可能な C ライブラリです。物理/論理コアを検出し、プロセス/スレッドをバインドする機能があります。

また、直接使用し続けたい場合は、 for use を返すこともできるようです。cpu_set_tsched_setaffinity()

于 2012-02-21T23:16:54.097 に答える