使用SetThreadAffinityMask()动态选择要在哪些线程上运行

Using SetThreadAffinityMask() to dynamically choose which threads to run on

本文关键字:线程 运行 SetThreadAffinityMask 动态 选择 使用      更新时间:2023-10-16

我正在编写一个基准测试程序,我想要的是在不同的内核上一个接一个地运行一个线程。因此,例如,它将只在核心0上运行工作,然后在核心0、1、1、2、3上运行,然后在0、1,2、3、4、5、6、7上运行(如果机器有8个核心)。我对需要传递给SetThreadAffinityMask()的第二个参数感到困惑。

我可以传递一个十进制数,也可以传递一种十六进制数。在十六进制中,我可以通过:

0x0001 for core 0,
0x0003 for cores 0,1,
0x000F for cores 0,1,2,3

但我正在努力找出如何动态地创造这些价值观。本质上,对于任何给定数量的内核,我都需要能够获得十六进制值,以将所有内核的亲和力设置为该数量。任何关于从哪里开始的帮助都将是非常好的。

"所有核到(但不包括)N"需要掩码值2N-1,因此:

(static_cast<DWORD_PTR>(1) << N) - 1;

位值为1 << core_number。所以,如果你有这样的东西:

vector<int> cpus_to_use = { 1, 3, 9, 11 }; 

然后你可以通过制作亲和掩模

int mask = 0;
for( i : cpus_to_use) 
    mask |= 1 << i; 

如果您只想设置ALL位,那么(1 << num_cores) - 1将为您设置num_cores位。