- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一台机器有 24 个物理内核(至少有人告诉我)运行 Debian:Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.68-1+ deb7u1 x86_64 GNU/Linux
。似乎是正确的:
usr@machine:~/$ cat /proc/cpuinfo | grep processor
processor : 0
processor : 1
<...>
processor : 22
processor : 23
我在尝试使用 Python 的 multiprocessing.pool.Pool
加载所有内核时遇到了一些问题。我使用了Pool(processes=None)
;文档说,如果提供了 None
,Python 使用 cpu_count()
。
唉,只有 8 个核心被 100% 加载,其他核心保持空闲状态(我使用 htop
来监控 CPU 负载)。我认为我无法正确 cooking Pools
并尝试“手动”调用 24 个进程:
print 'Starting processes...'
procs = list()
for param_set in all_params: # 24 items
p = Process(target=_wrap_test, args=[param_set])
p.start()
procs.append(p)
print 'Now waiting for them.'
for p in procs:
p.join()
我从我开始的流程中收到了 24 条“问候”消息:
Starting processes...
Executing combination: Session len: 15, delta: 10, ratio: 0.1, eps_relabel: 0.5, min_pts_lof: 5, alpha: 0.01, reduce: 500
< ... 22 more messages ... >
Executing combination: Session len: 15, delta: 10, ratio: 0.1, eps_relabel: 0.5, min_pts_lof: 7, alpha: 0.01, reduce: 2000
Now waiting for them.
但是仍然只加载了 8 个核心:
我在这里读到,numpy
、OpenBLAS 和多核执行可能存在问题。这就是我开始编写代码的方式:
OPENBLAS_MAIN_FREE=1 python -m tests.my_module
在我完成所有导入之后:
os.system("taskset -p 0xff %d" % os.getpid())
那么,问题来了:我应该怎么做才能让所有内核都达到 100% 负载?这仅仅是我对 Python 的不当使用,还是与多核机器上的操作系统限制有关?
已更新:一件更有趣的事情是 htop
输出中的一些不一致。如果您查看上图,您会看到 CPU 负载条下方的表格显示 30-50% 的负载远远超过 8 个内核,这与负载条所说的完全不同。然后,top
似乎同意这些条:8 个核心 100% 加载,其他核心空闲。
再次更新:
我用了this rather popular post在 SO 上,当我在所有导入后添加 os.system("taskset -p 0xff %d"% os.getpid())
行时。我不得不承认,当时我并没有想太多,尤其是在阅读了这篇文章之后:
With this line pasted in after the module imports, my example now runs on all cores
我是一个简单的人。我看到“作品很有魅力”,我复制并粘贴。不管怎样,在玩我的代码时,我最终删除了这一行。之后,我的代码开始在“手动”Process
启动场景的所有 24 个内核上执行。对于 Pool
场景,无论是否使用关联技巧,同样的问题仍然存在。
我不认为这是一个真正的答案,因为我不知道 Pool
有什么问题,但至少我设法让所有内核都满载。谢谢!
最佳答案
即使您解决了问题,我也会尝试对其进行解释以阐明思路。
就我所读到的内容而言,numpy 做了很多“魔术”来提高性能。魔术技巧之一是设置进程的 CPU 亲和性。
CPU 亲和性是操作系统调度程序的优化。它基本上强制给定进程始终在同一个 CPU 内核上运行。
这提高了性能,减少了 CPU 缓存失效的次数,并增加了引用局部性的好处。在高计算任务中,这些因素确实很重要。
我不喜欢 numpy 的一点是它隐含地完成了所有这些工作。经常让开发人员感到困惑。
您的进程未在所有内核上运行的事实是由于 numpy 在您导入模块时设置了与父进程的关联。然后,当您生成新进程时,亲和性会被继承,导致所有进程争夺少数核心,而不是有效地使用所有可用核心。
os.system("taskset -p 0xff %d"% os.getpid())
命令指示操作系统在解决您的问题的所有内核上重新设置关联。
如果你想看到它在 Pool 上工作,你可以使用以下技巧。
import os
from multiprocessing import Pool
def set_affinity_on_worker():
"""When a new worker process is created, the affinity is set to all CPUs"""
print("I'm the process %d, setting affinity to all CPUs." % os.getpid())
os.system("taskset -p 0xff %d" % os.getpid())
if __name__ == '__main__':
p = Pool(initializer=set_affinity_on_worker)
...
关于Python:多处理,8/24 核加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31320194/
我使用 4 核 i7 CPU(8 个逻辑核),debian linux 虚拟机也是 debian linux 程序使用 gcc 编译,没有进行特殊优化(默认编译设置) 我循环了该程序 1000 次。当
我有一个实时 linux 桌面应用程序(用 C 语言编写),我们正在移植到 ARM(4 核 Cortex v8-A72 CPU)。在架构上,它结合了高优先级显式 pthread(其中 6 个)和一对
我已经在 Digital Ocean ubuntu 实例上安装了 Solr 6: install_solr_service.sh solr-6.1.0.tgz 并验证 Solr 正在运行。但是,我无法
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 6年前关闭。 Improve this questi
我有一个大约 2000 维的特征向量。都是直方图特征。 我不知道在我的情况下哪个有效:将 SVM 与 RBF 核或卡方核应用? 你能建议我在我的情况下有效的内核吗? 最佳答案 一般来说,卡方和交集内核
我们有一台 12 核 MacPro 来进行一些蒙特卡罗计算。其 Intel Xeon 处理器启用了超线程 (HT),因此实际上应该有 24 个进程并行运行才能充分利用它们。然而,我们的计算在 12x1
所以这段代码: library(plyr) library(doMC) registerDoMC(cores=2) x=1:100 llply(x, some_function, .parallel=
Netty Server 流到 Netty 客户端(点对点,1 对 1): 好的 案例:Server和Client都是12 cores , 1Gbit NIC => 以每秒 300K 200 字节消息
我对以下 C# 代码的线程激活顺序感到困惑。它创建了 10 个线程,随机启动它们,每个线程模拟执行一个耗时的工作 10 次,如果你检查调试输出,线程似乎不是随机选择的,请看下面的输出示例,注意线程 #
这是我考试时提出的问题。我给出了以下答案,我的得分是0分。教授甚至不同意给予任何部分的认可,也没有告诉我我的答案有什么问题。谁能帮我找出我的答案有什么问题吗? 这是我在考试中给出的答案。缺点是:1)
我有一个 Intel Xeon E5-2620,它有 24 个 CPU。我写了一个应用程序,它创建 24 个线程来使用 openssl 解密 AES。当我在 100 万数据解密时将线程数从 1 增加到
我正在开发一个在图层上绘画的应用程序。这是一个示例代码,展示了我的绘画方式。 UIImageView * currentLayer = // getting the right layer... UI
在带有 2Tb DRAM 的 80 核 (160HT) nehalem 架构上运行一些测试后,我遇到了一个小的 HPC 问题: 当每个线程开始请求有关“错误”套接字上的对象的信息时,具有 2 个以上套
由于潜在的性能问题,我刚刚将测试实例从小型“标准”(1 核,1.75GB RAM)实例升级到中型“标准”实例(2 核,3.5GB RAM),这似乎是快速击中。我们确实存在应用程序池回收和必须重新预热某
我知道,为了在 Android 中保持响应式界面,繁重的工作必须在独立线程中完成。我很清楚如何实现这一点(通过使用 AsynTask...等),这不是问题的重点,只是让每个人都知道。 但是我已经在一个
我写了一个简单的多线程 Java 应用程序,主要方法只创建 5k 个线程,每个线程将循环处理一个包含 5M 条记录的列表。 我的机器规范: CPU 内核:12 个内核 内存:13Gb RAM 操作系统
让我们假设我们有固定数量的计算工作,没有阻塞、 sleep 、I/O 等待。工作可以很好地并行化——它由 100M 小而独立的计算任务组成。 什么是 4 核 CPU 的速度更快 - 运行 4 个线程或
我正在使用 WEKA/LibSVM 来训练术语提取系统的分类器。我的数据不是线性可分的,因此我使用 RBF 内核而不是线性内核。 我关注了guide from Hsu et al.并迭代 c 和 ga
谁能告诉我为什么在具有四个 ARMv7 处理器的 Jetson TK1 上调用 Python 的 multiprocessing.cpu_count() 函数会返回 1? >>> import mul
我是一名优秀的程序员,十分优秀!