如何确保进程在特定的物理CPU核心和线程中运行?

时间:2012-02-21 22:22:46

标签: linux affinity

This question询问确保两个进程在同一个CPU上运行。使用sched_setaffinity我可以将进程限制为多个逻辑CPU,但是如何确保将这些进程映射到特定的物理CPU和线程?

我希望映射是:

0 - CPU 0线程0
1 - CPU 0线程1
2 - CPU 1线程0
3 - CPU 1线程1
等...

其中左侧的数字是sched_setaffinity中使用的相关CPU。

然而,当我试图对此进行测试时,似乎并非如此。

为了测试这个,我使用了CPUID指令,该指令返回EBX中当前核心的初始APIC ID:

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的掩码中找到正确的位映射到物理内核?

1 个答案:

答案 0 :(得分:2)

hwloc是一个可移植的C库,用于发现硬件/ NUMA拓扑,还可以将进程/线程绑定到特定的内核。它具有发现物理/逻辑核心,然后将进程/线程绑定到它的功能。

它也looks like如果您想继续使用cpu_set_t,它还可以返回sched_setaffinity()以供{{1}}使用。