2

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

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

...,TPL 会为其所有工作兑现这一点吗?也就是说,是否有任何默认调度程序可以将工作推送到我给定掩码不允许的处理器?有没有可以证明这一点的测试?

4

1 回答 1

3

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

它不能兑现它的唯一方法是明确地去改变亲和力,它没有这样做。

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

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

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

附带说明一下,显式设置 CPU 亲和性很少是一个好主意。好奇你的用例是什么。

于 2013-01-11T22:25:13.587 回答