DOS Batch多核亲和力不起作用

时间:2015-02-20 13:39:42

标签: python batch-file cmd dos affinity

我有一个批处理启动一些可执行文件.exe和.py(python)来处理一些数据。

使用开始/亲和力X mybatch.bat 只有当X等于0,2,4或8(各个核心)时,它才会起作用 但是,如果我将使用15或F或0xF(在我看来所有4个核心中)的多核X,它仍将仅在第一个核心上运行。

是否与批处理调用.exe文件这一事实有关,这些文件可能无法以这种方式进行关联性控制?

操作系统:Windows 7 64位

2 个答案:

答案 0 :(得分:1)

这更像是对评论中出现的问题的回答,但我希望它可能有所帮助。我必须将其添加为答案,因为它对于评论限制而言变得太大了:

似乎对这里的两件事存在误解:“处理器亲和力”实际意味着什么,以及Windows调度程序的实际工作方式。

这个SetProcessAffinityMask(...)的含义是“哪个处理器可以进程(即”所有线程 过程“)可以继续,”

SetThreadAffinityMask(...)明确是特定于线程的。

Windows调度程序(在最基本级别)绝对不区分线程和进程 - “进程”只是包含一个或多个线程的容器。 IOW(和过度简化) - 调度程序没有进程这样的东西,“线程”是可调度的东西:进程没有没有与此相关(“流程”是关于开放句柄,资源等的更多生命周期管理问题。)

如果您有单线程进程,那么将“进程”关联掩码设置为以下内容并不重要:调度程序将调度一个线程(对于任何屏蔽处理器)根据1)它最后被绑定到哪个处理器 - 理想情况,开销较少,2)下一个可用于给定可运行线程的处理器具有相同的优先级(比这更复杂,但是一般想法),以及3)关于优先级倒置,可等待对象,内核APC事件等的可能是暂时的问题。

所以回答你的问题(比预期的要长得多):

  

“但是,如果我将使用15或F或0xF的多核X(在我看来意味着所有4个核心),它仍然只能运行在第一个核心”

我之前所说的关于尝试使用最近使用的处理器的调度程序在这里很重要:如果您有(或基本上)单线程进程,则调度算法采用最乐观的方法:用于切换的绑定CPU(可能更便宜的CPU /主存储器高速缓存,先前的分支预测评估等)。这就解释了为什么你会看到一个应用程序(无论进程级别的亲和力),只有一个(再次,这里适用的警告)线程看似“卡在”一个CPU /核心。

所以:

使用“/ affinity X”开关实际执行的操作是

1)将调度程序限制为在CPU核心子集上调度线程(即并非所有),并且 2)将它们限制为调度程序内核认为“可用于下一个可运行的线程切换到”的子集,以及
3)如果它们不是多线程应用程序(并且能够利用它),“更多内核”对任何事情都没有帮助 - 您可能只是将单个执行线程反弹到不同的内核(尽管调度程序试图最小化这个,如上所述)。

这就是你的线程“粘性”的原因 - 你告诉调度程序这样做。

答案 1 :(得分:0)

AFAIK / AFFINITY使用十六进制值作为参数。以下是有关此主题的更多信息:Set affinity with start /AFFINITY command on Windows 7

编辑:0xF应该是正确的参数,因为你想要加载所有4个CPU,这需要位于{strong> hex 中的00001111的位掩码F强>