3

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

我希望映射是:

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

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

但是,当我尝试对此进行测试时,似乎情况并非如此。

为了测试这一点,我使用了以下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到物理内核的正确映射?

4

1 回答 1

2

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

如果您想继续直接使用它,它看起来也可以返回一个cpu_set_tfor use with 。sched_setaffinity()

于 2012-02-21T23:16:54.097 回答