【问题标题】:Shared memory parallelization共享内存并行化
【发布时间】:2021-01-23 05:37:42
【问题描述】:

我有一个大小为n 的向量v,我需要使用此代码将每个条目递增1:

 for output_diff in results:
     for i in n:
         if (output_diff & (1 << i)):
             v[i] += 1

结果的大小约为 10 000 000,n = 4096 的大小。如何在 python 中使用并行或多处理来做到这一点?我尝试使用 How to implement a reduce operation in python multiprocessing? 中的想法,但它比串行方式花费的时间更长。

【问题讨论】:

  • 尝试改用numpy
  • 情况并非如此。多个python进程可以同时执行。 “标准库中为受 CPU 限制的应用程序提供的主要替代方案是多处理模块,它适用于由相对较少数量的长时间运行的计算任务组成的工作负载,但如果单个操作的持续时间很短,则会导致过多的消息传递开销" - python-notes.curiousefficiency.org/en/latest/python3/…
  • @AzatIbrakov 你有什么例子吗?

标签: python


【解决方案1】:

如果您的操作需要很长时间(比如可能需要 30 秒或更长时间),那么您可能会受益于将 results 划分为您想要运行 python 进程的多个部分,并使用 python 的 multiprocessing 模块。如果操作不需要那么长时间,启动这些新进程的开销将超过使用它们的好处。

由于正在执行的操作不依赖于存储在v 中的值,因此每个进程都可以写入一个独立的向量,并且您可以在最后聚合结果。向每个进程传递一个与v 长度相同的0 向量v_prime。执行上述操作,每个进程处理results中的一部分output_diffs,并递增v_prime中的对应值而不是v。然后在最后,每个进程返回它的向量v_prime。将所有返回的 v_primes 和原始的 v 相加(这是将项目表示为 numpy 数组的地方,因为很容易添加相同长度的 numpy 向量)以获得正确的结果。

【讨论】:

    猜你喜欢
    • 2017-10-17
    • 2012-07-19
    • 2013-06-04
    • 2015-10-13
    • 2016-06-17
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2013-02-25
    相关资源
    最近更新 更多