2012-02-21 22 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

相关问题