gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:15:52 25 4
gpt4 key购买 nike

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 mask 似乎实际上并不对应于物理内核和线程。

我如何才能在 sched_setaffinity 的掩码中找到正确的位映射到物理内核?

最佳答案

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

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

关于linux - 如何确保进程运行在特定的物理CPU核心和线程中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9386229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com