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
的掩码中找到正确的位映射到物理内核?
答案 0 :(得分:2)
hwloc是一个可移植的C库,用于发现硬件/ NUMA拓扑,还可以将进程/线程绑定到特定的内核。它具有发现物理/逻辑核心,然后将进程/线程绑定到它的功能。
它也looks like如果您想继续使用cpu_set_t
,它还可以返回sched_setaffinity()
以供{{1}}使用。