我正在使用 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)
将线程绑定(bind)到物理内核。在
platform.machine()
中为不包含 Intel 或 amd 的系统启用 smt 解决方案。
然而,这样做会出现几个问题。
如何知道系统是否启用了超线程?
在使用
os.sched_setaffinity(0,mask)
之前,如何知道哪些cpu核心数是物理的还是逻辑的?
问题是程序目前通过 python3 支持大量平台:所有 Unixes,以及 Windows 和 Osx 和 Openvms,同时不要忘记 PyPy。
任何修复问题的补丁都不应生成新进程,也不应添加未包含的依赖项,也不应放弃对上述某些平台的支持。
有什么干净的方法可以解决这个问题?
最佳答案
loky
library包含一个相当便携的解决方案。它确实生成了一个进程,然后缓存了结果——所以你不会多次生成一个进程。鉴于这是支持流行库(如 sklearn
)的解决方案,我猜它几乎和它一样好。
关于python - 如何以跨系统方式将进程仅绑定(bind)到物理内核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61483639/