我有 1500 个线程..我希望它们在 12 个处理器上运行...为此我称之为
SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors))
;其中处理器数 = 12。口罩的使用正确吗?它需要可扩展,也就是说,如果我希望它仅在 11 个处理器上运行,那么
SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors));
numprocessors=11。
问问题
481 次
2 回答
5
这是正确的。
但是出于性能和效率的原因,我建议您以某种方式更改线程模型,使线程数等于 CPU 执行核心的数量,然后这些线程在您的“任务管理器”分发的 1500 个任务/工作项上工作.
如果您不想创建自己的“任务管理器”,您可以使用 Windows ThreadPool API,将任务分配给由 O/S 管理的“线程池”
于 2011-03-29T06:18:03.117 回答
2
从语法上讲 SetThreadAffinityMask(GetCurrentThread(),1<<(GetThreadId()%numprocessors)) 是正确的,但仅仅因为您有很多线程和处理器就使用亲和力并不是一个好主意。它可能会干扰调度程序并降低性能。您可以将其用于某些线程以最大程度地减少缓存未命中。当线程从一个处理器移动到另一个处理器时,就会发生高速缓存未命中。
于 2011-03-29T05:55:07.303 回答