【发布时间】: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