【问题标题】:DOS Batch multicore affinity not workingDOS Batch 多核关联不起作用
【发布时间】:2015-02-20 13:39:41
【问题描述】:

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

使用 start /affinity X mybatch.bat 只有当 X 等于 0、2、4 或 8(单个内核)时,它才会正常工作
但是,如果我使用 15 或 F 或 0xF 之类的多核 X(在我看来意味着所有 4 个内核),它仍然只能在第一个内核上运行。

这是否与批处理正在调用可能无法通过这种方式进行关联控制的 .exe 文件这一事实有关?

操作系统:Windows 7 64 位

【问题讨论】:

  • 如何检查你的程序在哪个 CPU 上运行?
  • Affinity 是允许的核心/CPU 的掩码。它不会神奇地使单线程程序多线程。当然,您可以同时运行固定到内核的那些 .exe,但无论如何,操作系统调度程序默认情况下都会这样做。

标签: python batch-file cmd dos affinity


【解决方案1】:

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

这里似乎对两件事有误解:“处理器亲和性”的实际含义,以及 Windows 调度程序的实际工作方式。

SetProcessAffinityMask(...) 的意思是“哪些处理器 可以处理(即“所有 个线程进程") 可以继续运行,"

SetThreadAffinityMask(...) 显然是特定于线程的。

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

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

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

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

我之前所说的关于调度程序尝试使用最近使用的处理器的内容在这里很重要:如果您有一个(或本质上)单线程进程,调度算法将采用最乐观的方法:之前用于切换的绑定 CPU(对于 CPU/主内存缓存、先前的分支预测评估等可能更便宜)。这就解释了为什么您会看到一个应用程序(无论进程级别的关联性如何)只有一个(同样,此处需要注意事项)线程似乎“卡”在一个 CPU/内核上。

所以:

您使用“/affinity X”开关有效地做的是

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

这就是为什么你的线程是“粘性的”——你是在告诉调度程序让它们如此。

【讨论】:

    【解决方案2】:

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

    编辑:0xF 应该是适合您的正确参数,因为您要加载所有 4 个 CPU,这需要位掩码 00001111,即 hex 中的 F

    【讨论】:

    • 我相信您已经回答了这个问题,只是为了获得第一个答案的分数。我又问了一个问题。
    • 我相信你不愿意去想答案。
    • 四核处理器中所有内核的十六进制值是多少?我试过 F 和 0xF 参数
    • 0xFF 表示 11111111 表示所有 8 个 CPU 都已加载。
    • 请告诉我,您不认为将程序作为多核运行会使其自动成为多核。如果您的代码不是使用多线程技术编写的,它将始终只使用一个线程。在多个 CPU 上运行程序只会允许程序使用多个内核。但是您仍然必须以正确的方式实现它。它不仅可以并行工作!
    猜你喜欢
    • 1970-01-01
    • 2012-02-12
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多