Setting ProcessorAffinity and the TPL

本文关键字:TPL the and ProcessorAffinity Setting | 更新日期: 2023-09-27 17:52:36

如果我为我的进程设置处理器亲和性:

var me = Process.GetCurrentProcess();
me.ProcessorAffinity = (IntPtr) processorAffinityMask;

…TPL会为他们所做的一切而荣誉吗?也就是说,是否有任何与默认调度器,将工作推到一个处理器不允许我给定的掩码?有测试可以证明这一点吗?

Setting ProcessorAffinity and the TPL

是,TPL将遵循您指定的关联掩码。

尊重它的唯一方法是显式地去改变亲和性,而它并没有这样做。

虽然在TPL中创建一个测试来运行每个可能的代码路径是非常不可行的,但您当然可以设置一个从许多可用内核中受益的测试,将亲和性掩码设置为1个CPU,并通过任务管理器观察亲和性永远不会改变,CPU利用率永远不会超过1/N,其中N是存在的内核数。

您还可以将该测试扩展为具有M个核的亲和性,并观察到CPU利用率<= M/N。您还可以直接观察到在任务管理器中亲和性没有变化。

一个合适的测试应该是每次迭代需要大量的时间,并提供许多独立的工作单元,例如,计算第一个素数> N,其中N很大,并使用Parallel。对目标质数数组执行Foreach操作。数组的大小应该明显大于当前的内核数量。

另一方面,显式设置CPU亲和性很少是一个好主意。很好奇你的用例是什么