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

这个问题询问确保两个进程在同一个CPU上运行。 使用sched_setaffinity我可以限制一个进程到多个逻辑CPU,但我怎样才能确保这些映射到特定的物理CPU和线程?

我期望的映射将是:

0 – CPU 0线程0
1 – CPU 0线程1
2 – CPU 1线程0
3 – CPU 1线程1
等等…

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

但是,当我试图testing这个时,看起来并不一定如此。

为了testing这个,我使用了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根据上面列出的schemeI分配了初始APIC ID,看起来cpu掩码实际上并不对应于物理核心和线程。

我如何find正确的sched_setaffinity掩码中位的映射到物理内核?

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

它也看起来像它也可以返回一个cpu_set_t用于sched_setaffinity() ,如果你想继续使用它。