我正在编写一个基准测试程序,我想要的是一个接一个地在不同的核心上运行一个线程。因此,例如,它将仅在核心0上运行,然后在核心0,1上运行,然后在核心0,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
但我正在努力研究如何动态创建这些值。基本上对于任何给定数量的核心,我需要能够获得十六进制值以设置与所有核心的亲和力,直到该数量。任何有关从哪里开始的帮助都会很棒。
答案 0 :(得分:2)
“所有核心(但不包括)N”都需要掩码值2 N - 1,所以:
(static_cast<DWORD_PTR>(1) << N) - 1;
答案 1 :(得分:1)
位值为1 << core_number
。所以,如果你有这样的事情:
vector<int> cpus_to_use = { 1, 3, 9, 11 };
然后您可以通过以下方式制作亲和力掩码:
int mask = 0;
for( i : cpus_to_use)
mask |= 1 << i;
如果您只想设置所有位,则(1 << num_cores) - 1
将设置num_cores
位。