这个问题 https://stackoverflow.com/questions/4664668/how-to-force-two-process-to-run-on-the-same-cpu询问确保两个进程在同一 CPU 上运行。使用sched_setaffinity
我可以将一个进程限制为多个逻辑 CPU,但如何确保这些映射到特定的物理 CPU 和线程?
我希望映射是:
0 - CPU 0 线程 0
1 - CPU 0 线程 1
2 - CPU 1 线程 0
3 - CPU 1 线程 1
etc...
其中左侧的数字是所使用的相关CPUsched_setaffinity
.
然而,当我尝试测试这一点时,情况似乎不一定如此。
为了测试这一点,我使用了CPUID
指令,返回当前核心的初始APIC IDEBX
:
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 http://www.open-mpi.org/projects/hwloc/是一个可移植的 C 库,用于发现硬件/NUMA 拓扑,并将进程/线程绑定到特定内核。它具有发现物理/逻辑核心,然后将进程/线程绑定到其上的功能。
It also 好像 http://www.open-mpi.org/projects/hwloc/doc/v1.4/a00030_source.php它还可以返回一个cpu_set_t
与使用sched_setaffinity()
,如果你想继续直接使用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)