【问题标题】:How can I ensure that a process runs in a specific physical CPU core and thread?如何确保进程在特定的物理 CPU 内核和线程中运行?
【发布时间】:2012-02-21 22:22:45
【问题描述】:

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 掩码中位到物理内核的正确映射?

【问题讨论】:

    标签: linux affinity


    【解决方案1】:

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

    它也可以是looks like,它也可以返回一个cpu_set_t,用于sched_setaffinity(),如果你想继续直接使用的话。

    【讨论】:

    • hwloc 的最佳特性之一是能够显示系统拓扑图——CPU 如何共享缓存、内存域等。
    猜你喜欢
    • 1970-01-01
    • 2013-02-01
    • 2017-08-22
    • 1970-01-01
    • 2011-12-23
    • 2010-12-26
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多