为了账号安全,请及时绑定邮箱和手机立即绑定

如果我的 8 核 CPU 支持 16 个线程,对于池中的进程数,16 是否比 8 更好?

如果我的 8 核 CPU 支持 16 个线程,对于池中的进程数,16 是否比 8 更好?

慕尼黑5688855 2022-12-06 15:37:28
我在 python 3.7 中使用多处理一些文章说,在 Pool 中使用的进程数是 CPU 内核的数量。我的 AMD Ryzen CPU 有 8 个内核,可以运行 16 个线程。那么,进程数应该是8个还是16个呢?import multiprocessing as mp pool = mp.Pool( processes = 16 )         # since 16 threads are supported?
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

“那么,进程数应该是 8 还是 16?”


因此,如果子进程分布式工作负载群是缓存重用密集型(而不是内存 I/O),- SpaceDOMAINconstraints 规则,因为可缓存数据的大小将在决定是 8 还是 16 时发挥主要作用.

为什么 ?
因为内存 I/O 的成本比缓存中的数据高出大约一千倍,按内存 I/OTimeDOMAIN支付。3xx - 4xx [ns]0.1 ~ 0.4 [ns]

如何做出决定?
在决定生产规模配置之前,进行小规模测试。


因此,如果要分布式的工作负载群是网络 I/O,或其他显着的(本地非奇异的)延迟源,依赖,则TimeDOMAIN可能会受益于延迟屏蔽技巧,运行 16、160 或仅1600 个线程(在这种情况下不是进程)。

为什么 ?
因为进行网络 I/O 的成本提供了如此多的等待时间(一些[ms]网络 I/O RTT 延迟时间足以处理1E7 ~ 10.000.000每个 CPU 核心 uop-s,这是相当很多工作。因此,即使是整个进程的智能交错,这里也只使用基于延迟屏蔽的线程并发处理可能适合(因为等待来自网络 I/O 的远程“答案”的线程不应该为 GIL 锁而战,因为他们在收到预期的 I/O 字节之前没有什么可计算的,是吗?)

如何做出决定?
查看代码以确定游戏中有多少网络 I/O 提取和缓存足迹大小的读取(在 2020/Q2+ L1 缓存增长到大约几秒[MB])。对于这些操作重复多次的情况,请毫不犹豫地为每个“慢速”网络 I/O 目标启动一个线程,因为处理将受益于“长时间”等待的巧合创建的屏蔽 -以廉价(“快速”)和(由于“许多”和“长”等待时间)相当稀疏的线程切换或什至 O/S 驱动的进程调度程序将完整的子进程映射到一个免费的 CPU 核心。


因此,如果要分配的工作负载群是上述情况的某种混合,除了在实际硬件本地/非本地资源上进行试验之外别无他法。

为什么 ?
因为没有经验法则来微调工作负载处理到实际 CPU 核心资源的映射。


尽管如此,
人们可能很容易发现付出的代价比以往任何时候都多回报实现减速
的已知陷阱,而不是(只是希望获得)加速

在所有情况下,遵守修订后的阿姆达尔定律的开销严格、资源感知和工作负载的原子性确定了一个收益递减点,之后任何更多的工作人员(CPU 核心)都不会提高希望获得的加速。Stack Overflow 的帖子中表达了 S << 1 的许多惊喜,因此人们可以阅读尽可能多的不该做的事情(通过反模式学习)。


查看完整回答
反对 回复 2022-12-06
  • 1 回答
  • 0 关注
  • 226 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信