2013-01-11 67 views
2

如果我把我的处理器亲和力为我的过程中,像这样:设置处理器亲和性和TPL

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

...,将第三方物流的荣誉,对于所有的工作?也就是说,是否有任何got-ya的默认调度程序会将工作推送到我的给定掩码不允许的处理器?有没有可以证明这一点的测试?

回答

3

是的TPL将遵守您指定的关联蒙版。

它可能的唯一途径不是荣幸它是明确去改变亲和力,它不这样做。

尽管创建一个可以在TPL中实现所有可能的代码路径的测试是非常不可行的,但您可以设置一个测试,该测试可以从多个可用内核中受益,将亲和性掩码设置为1个CPU,并通过Task管理器,亲和力永不改变,CPU利用率永远不会超过1/N,其中N是存在的核数量。

您也可以将该测试扩展为具有M个核心的亲和性,并观察CPU利用率< = M/N。您也可以直接观察在任务管理器中亲和力不会更改。

合适的测试将是每次迭代需要大量时间并提供许多独立工作单元的测试,例如,计算第一个素数> N,其中N很大,并在目标素数阵列上使用Parallel.Foreach。阵列大小应该明显大于存在的核心数量。

在附注中,显式设置CPU关联性很少是一个好主意。好奇你的用例是什么。

+0

测试的另一种选择是锁定GetCurrentProcessorNumber以查看TPL正在使用哪个逻辑处理器并收集结果。同意你的最后一条评论,操作系统在调度内容方面非常出色。 – vcsjones

+0

谢谢!我无法深入细节,但由于系统上的其他进程,需要将此进程固定到显式处理器。 –