【问题标题】:How many processes should I create for the multi-threads CPU in the computational intensive scenario?在计算密集型场景中,我应该为多线程 CPU 创建多少进程?
【发布时间】:2019-07-22 06:09:57
【问题描述】:

我有一个 32 核和 64 线程 CPU 用于执行科学计算任务。我应该创建多少进程?
需要注意的是,我的程序是计算密集型的,涉及大量基于 Numpy 的矩阵计算。现在,我使用 Python 默认进程池来执行这个任务。它将创建 64 个进程。它的性能会比 32 个进程更好还是更差?

【问题讨论】:

  • 测试一下。对于这些没有单一的答案,因为所有程序都不同并且使用处理器的方式也不同。有些人会等待,所以 64 可能会很好。有些没有。

标签: python process


【解决方案1】:

由于全局解释器锁 (GIL),我不确定 Python 是否适合多线程计算密集型场景。基本上,您应该在 Python 中仅将多线程用于 IO 绑定任务。我不确定 Numpy 是否适用,因为如果我没记错的话,大部分是用 C++ 编写的。

如果您正在寻找替代方案,您可以使用Apache Spark 框架在多台机器上分配工作。我认为即使您在本地模式下(即在您的机器上)使用 8/16 个工作人员运行代码,您也可以获得一些性能提升。

编辑:对不起,我刚刚在我链接的 GIL 页面上读到它不适用于 Numpy。我仍然认为这并不是您可以使用的最佳工具,因为有效的多线程编程很难正确进行,并且您可以在链接中阅读到其他一些细微差别。

【讨论】:

    【解决方案2】:

    不可能给您答案,因为这取决于您的确切问题和代码,但也可能取决于您的硬件。 基本上,多处理的过程是将工作分成X个部分,然后分配给每个进程,让每个进程工作,然后合并每个结果。

    现在您需要知道是否可以有效地将工作拆分为 64 个部分,同时保持每个部分的工作时间大致相同(如果一个过程占用 90% 的时间并且您无法拆分它,那么拥有更多部分是没有用的超过 2 个进程,因为您将始终等待第一个进程)。

    如果你能做到,并且拆分和合并工作/结果不需要太长时间(请记住,这是一项补充工作,因此需要额外的时间),那么使用更多流程会很有趣。

    如果您在拆分/合并工作/结果上花费了太多时间,您也可以通过使用更少的进程来加速您的代码(有时使用更多的进程获得的加速可能是负面的)。

    您还必须记住,在某些架构中,内存缓存可以在内核之间共享,因此可能会严重影响多处理的性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多