有12个核心,12个线程正在运行..我想将1个线程绑定到每个核心。这就是我在每个帖子的开头调用的内容。
int core=12;
SetThreadAffinityMask(GetCurrentThread(),(1<<core)-1);
这就是我所拥有的...我不知道这是否是适当的方式来调用它。我不确定我是否理解第二个参数是如何工作的。
我是否还需要调用SetProcessaffinitymask?
答案 0 :(得分:8)
SetThreadAffinityMask()
的第二个参数是位向量。每个位对应一个逻辑处理器:CPU核心或超线程。如果第二个参数中的某个位设置为1,则允许该线程在相应的核心上运行。
对于等于12的core
,您的掩码(1<<core)-1
包含0..11位,因此允许每个线程在12个核心中的任何一个上运行。大概你想要将每个线程设置为在专用核心上运行。为此,您需要每个线程具有介于0和11之间的唯一编号,并且仅设置关联掩码的相应位。提示:您可以使用InterlockedIncrement()
来获取唯一编号。或者,如果你的线程都是在循环中启动的,那么唯一的数字是已知的(它是循环行程计数),你可以使用它,例如传递给每个线程作为参数,或者为同一循环中的新线程设置亲和力。
请注意David Heffernan的回答中的注意事项:除非你知道如何使用亲和力,否则最好不要使用亲和力。除了David已经提到的原因之外,我还将在具有不同数量的套接字,内核和超线程的计算机之间添加应用程序可移植性。
答案 1 :(得分:7)
您似乎正在设置所有12个处理器的亲和力,这不是您想要的。
我会在主线程中循环遍历设置亲和性的所有12个线程。不要在线程内设置关联,因为这需要线程知道它通常不需要知道的索引。我将声明一个掩码变量并为其赋值1.每次循环你设置线程亲和力然后换1.你不应该改变进程亲和力。
谨慎一点。设置亲和力是危险的。如果用户更改了进程关联,那么您最终可能会遇到无法在任何处理器上运行的线程。小心。
另外,根据我的经验,手动设置亲和力没有性能优势,有时速度较慢。通常系统做得很好。
答案 2 :(得分:5)
您可以编写如下代码。 GetThreadHandle(i)是获取每个线程句柄的函数。
int core = 12;
for(int i=0; i<core; i++)
SetThreadAffinityMask(GetThreadHandle(i), 1<<i);
答案 3 :(得分:0)
位掩码通常为64位。对于有超过32个处理器的情况,可以避免算术溢出的更便携的解决方案是:
auto mask = (static_cast<DWORD_PTR>(1) << core);//core number starts from 0
auto ret = SetThreadAffinityMask(GetCurrentThread(), mask);