如何确保进程在特定的物理CPU内核和线程中运行?
问题描述:
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
到物理内核掩码中位的正确映射?
答
hwloc是一个可移植的C库,用于发现硬件/ NUMA拓扑,并将进程/线程绑定到特定内核。它具有发现物理/逻辑内核的功能,然后将进程/线程绑定到它。
它也looks like它也可以返回cpu_set_t
用于sched_setaffinity()
,如果你想继续使用,直接。
hwloc的最大特点之一是能够显示系统拓扑图--CPU如何共享缓存,内存域等。 – 2012-02-22 03:16:19