如果我为我的进程设置处理器亲和力,如下所示:
var me = Process.GetCurrentProcess();
me.ProcessorAffinity = (IntPtr) processorAffinityMask;
......,TPL是否会尊重它的所有工作?也就是说,是否有任何使用默认调度程序的工具将工作推送到我的给定掩码不允许的处理器?有没有可以证明这一点的测试?
答案 0 :(得分:3)
是的,TPL将遵守您指定的亲和力掩码。
它不尊重它的唯一方法是明确地去改变亲和力,而不是那样做。
虽然创建一个可以在TPL中运行每个可能的代码路径的测试是非常不可行的,但您当然可以设置一个可以从许多可用内核中受益的测试,将关联掩码设置为1个CPU,并通过任务管理器进行观察亲和力永远不会改变,CPU利用率永远不会超过1 / N,其中N是存在的核心数。
您还可以将该测试扩展为具有M个核心的亲和力,并观察CPU利用率< = M / N.您还可以直接观察到任务管理器中的关联性不会发生变化。
合适的测试将是每次迭代需要大量时间并且提供许多独立工作单元的测试,例如,计算第一个素数> N其中N很大并且在目标素数数组上使用Parallel.Foreach。数组大小应显着大于存在的核心数。
另一方面,显式设置CPU亲和性很少是一个好主意。好奇你的用例是什么。