【问题标题】:How to bind a process to only physical cores in a cross system way?如何以跨系统的方式将进程仅绑定到物理内核?
【发布时间】:2020-04-28 15:12:01
【问题描述】:

我正在使用a project where each time you double the number of threads,您会增加 40% 到 60% 的开销。由于超线程将性能提高到最高 30%,这意味着程序在超线程系统上的运行速度比单线程模式要慢。

第一步似乎很简单。

  • 通过len(os.sched_getaffinity(0))获取系统线程数

  • 通过z3参数限制线程数。

  • 使用os.sched_setaffinity(0,mask) 将线程绑定到物理内核。

  • platform.machine()内不包含 Intel 或 amd 的系统启用 smt 解决方案。

但是这样做会出现几个问题。

  • 如何知道系统是否开启了超线程?

  • 在使用os.sched_setaffinity(0,mask)之前,如何知道哪些cpu核心数是物理的还是逻辑的?

问题是该程序目前通过 python3 支持多种平台:所有 Unix,以及 Windows 和 Osx 和 Openvms,同时不要忘记 PyPy。

任何修复问题的补丁都不应该产生新进程,也不应该添加不包含的依赖项,也不应该放弃对上述某些平台的支持。

有什么干净的方法可以解决这个问题?

【问题讨论】:

  • @VladimirBershov 这在 Openvms 上不受支持,因此不支持跨平台。我认为解决方案应该是基于当前案例的纯 python。
  • @PatrickTrentin 但这是一个 Python 问题!不是 C++。
  • @PatrickTrentin 项目本身目前不使用二进制代码。我怀疑他们会接受这样的补丁。在性能方面,这对 PyPy 来说也是个问题。
  • @user2284570 你考虑过psutil.cpu_count(logical=False),还是你的一些平台不支持?

标签: python python-3.x cross-platform z3 hyperthreading


【解决方案1】:

loky library 包含一个相当便携的解决方案。它确实产生了一个进程,然后缓存了结果——所以它不像你不止一次地产生一个进程。鉴于这是支持 sklearn 等流行库的解决方案,我猜它几乎和它一样好。

【讨论】:

  • 它在树林下使用lscpu。 Openvms 和 Windows 上不存在的实用程序。
  • 它有 Windows 的替代方案。我相信您可以添加另一个 elif 来处理 openvms。如果您找到更好的解决方案,您绝对应该考虑将其回馈给 loky。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 2014-10-18
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
相关资源
最近更新 更多