python - 如何以跨系统的方式将进程仅绑定到物理内核?
问题描述
我正在使用一个项目,每次将线程数加倍时,都会增加 40% 到 60% 的开销。由于超线程将性能提高到最大 30%,这意味着程序在超线程系统上的运行速度比单线程模式要慢。
第一步似乎很简单。
通过获取系统上的线程数
len(os.sched_getaffinity(0))
通过z3参数限制线程数。
使用 . 将线程绑定到物理内核
os.sched_setaffinity(0,mask)
。为内部不包含 Intel 或 amd 的系统启用 smt 解决方案
platform.machine()
。
然而,这样做会出现几个问题。
如何知道系统是否启用了超线程?
在使用之前
os.sched_setaffinity(0,mask)
,如何知道哪些cpu核心数是物理的还是逻辑的?
问题是该程序目前通过 python3 支持多种平台:所有 Unix,以及 Windows、Osx 和 Openvms,同时不要忘记 PyPy。
任何修复问题的补丁都不应产生新进程,也不应添加不包含的依赖项,也不应放弃对上述某些平台的支持。
什么是解决此问题的干净方法?
解决方案
该loky
库包含一个相当可移植的解决方案。它确实产生了一个进程,然后缓存了结果——所以它不像你不止一次地产生一个进程。鉴于这是支持流行库之类的解决方案sklearn
,我猜它几乎和它一样好。
推荐阅读
- swift - Firestore 在快照中查询快照?
- ios - 符号进入最终二进制文件,但我在任何中间文件中都找不到它
- java - 自定义 Java 事件
- javascript - change the database and the button state without refreshing the page - laravel
- keycloak - Successful reset password redirects to wrong client upon reset
- reactjs - Toggle in AND out using componentDidMount and componentWillUnmount in React?
- javascript - 在 Eloquent Javascript 第 11 章 - 异步编程中 routeRequest 调用“路由”类型处理程序的目的是什么
- css - 试图强制元素在另一条线上但不工作
- xcode - Xcode kivy 无效的 python3 符号链接
- excel - 检查椭圆形位置vba