C# 设置ProcessorAffinity和TPL

C# 设置ProcessorAffinity和TPL,c#,task-parallel-library,C#,Task Parallel Library,如果我这样设置进程的处理器关联性: var me = Process.GetCurrentProcess(); me.ProcessorAffinity = (IntPtr) processorAffinityMask; …第三方物流会为其所有的工作而尊重这一点吗?也就是说,是否有任何带有默认调度程序的got-ya将工作推送到给定掩码不允许的处理器?是否有测试可以证明这一点?是的,TPL将遵守您指定的亲和性掩码 它不能尊重它的唯一方式是明确地去改变亲和性,而它并没有这样做 虽然创建一个测试来执

如果我这样设置进程的处理器关联性:

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

…第三方物流会为其所有的工作而尊重这一点吗?也就是说,是否有任何带有默认调度程序的got-ya将工作推送到给定掩码不允许的处理器?是否有测试可以证明这一点?

是的,TPL将遵守您指定的亲和性掩码

它不能尊重它的唯一方式是明确地去改变亲和性,而它并没有这样做

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

您还可以扩展该测试,使其具有M个内核的亲和力,并观察CPU利用率N,其中N很大,并在目标素数数组上使用Parallel.Foreach。阵列大小应明显大于存在的核心数


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

测试的另一个选项是pinvoke GetCurrentProcessorNumber以查看TPL正在使用哪个逻辑处理器,并收集结果。同意你最后的评论,操作系统非常擅长安排工作。谢谢!我无法深入了解细节,但由于系统上的其他进程,需要将此进程固定到显式处理器。