2012-02-21 39 views
3

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到物理內核掩碼中位的正確映射?

回答

2

hwloc是一個可移植的C庫,用於發現硬件/ NUMA拓撲,並將進程/線程綁定到特定內核。它具有發現物理/邏輯內核的功能,然後將進程/線程綁定到它。

它也looks like它也可以返回cpu_set_t用於sched_setaffinity(),如果你想繼續使用,直接。

+0

hwloc的最大特點之一是能夠顯示系統拓撲圖--CPU如何共享緩存,內存域等。 – 2012-02-22 03:16:19

相關問題