This question詢問確保兩個進程在同一CPU上運行。使用sched_setaffinity
我可以將進程限制爲多個邏輯CPU,但是如何確保將這些進程映射到特定的物理CPU和線程?如何確保進程在特定的物理CPU內核和線程中運行?
我期望的映射將是:
0 - CPU 0線程0
1 - CPU 0線程1
2 - CPU 1線程0
3 - CPU 1線程1
等..
其中左邊的數字是sched_setaffinity
中使用的相關CPU。
但是,當我試圖測試這一點時,似乎並不一定如此。
爲了測試這一點,我使用的CPUID
指令,它返回當前芯的初始APIC ID在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掩模和設置它們一次一個以便操作系統將進程遷移到每個邏輯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分配根據我上面列出的方案初始APIC的ID,它似乎是在CPU掩碼實際上並不對應於物理核心,線。
如何才能找到sched_setaffinity
到物理內核掩碼中位的正確映射?
hwloc的最大特點之一是能夠顯示系統拓撲圖--CPU如何共享緩存,內存域等。 – 2012-02-22 03:16:19