【问题标题】:Improve performance for solving linear systems in parallel with multiprocessing提高与多处理并行求解线性系统的性能
【发布时间】:2014-08-19 04:34:45
【问题描述】:

在求解抛物线 PDE 的耦合系统时,我需要在每个时间步求解线性系统。通过使用 IMEX 方法,我可以并行求解这些线性系统,并且只需在每个时间步更新右侧。

我的尝试是使用来自multiprocessing 的工人池、稀疏矩阵和来自scipy.sparse 的稀疏求解器。不幸的是,并行求解方程并没有那么快。

矩阵Mat1Mat2Mat3Mat4对于所有时间步长都是相同的,向量b1b2b3b4必须在每一步都相互依赖,即我有类似b1 = b1+b2+b3**2的东西。 我正在考虑使用multiprocessing.Array,但据我了解,它的目的是使流程能够更改我并不真正需要的给定数据。

有没有什么方法可以提高multiprocessing的性能?

我刚开始使用multiprocessing,因此我还不熟悉所有的可能性。 提前感谢您的帮助:-)

sparse_Mat1 = scipy.sparse.csr_matrix(Mat1)
sparse_Mat2 = scipy.sparse.csr_matrix(Mat2)
sparse_Mat3 = scipy.sparse.csr_matrix(Mat3)
sparse_Mat4 = scipy.sparse.csr_matrix(Mat4)


pool = multiprocessing.Pool(4)
# time steps
while t <= T+1/2*dt:

  # stuff to update b1, b2, b3 and b4
  ...

  res1 = pool.apply_async(scipy.sparse.linalg, [sparse_Mat1, b1])
  res2 = pool.apply_async(scipy.sparse.linalg, [sparse_Mat2, b2])
  res3 = pool.apply_async(scipy.sparse.linalg, [sparse_Mat3, b3])
  res4 = pool.apply_async(scipy.sparse.linalg, [sparse_Mat4, b4])

  sol1 =  = res1.get()
  sol2 =  = res2.get()
  sol3 =  = res3.get()
  sol4 =  = res4.get()
pool.close()

【问题讨论】:

    标签: python parallel-processing multiprocessing sparse-matrix


    【解决方案1】:

    1) 考虑numexpr - 这会并行评估函数。将其视为 scipy 的扩展。

    2) 用于多处理:通常最好有一个Pool 的工人。对于每个步骤,将数据发送给工作人员并使用map()(或imap_unordered)检索它。 示例如下

    向其他进程发送/接收数据会产生开销,因此每个 proc 都应该使用尽可能少的 I/O 来完成尽可能多的工作。在您的示例中,b1 = b1+b2+b3**2,所以这相当棘手。

    来源

    import multiprocessing
    
    def calc(num):
        return num*2
    
    if __name__=='__main__':  # required for Windows
        pool = multiprocessing.Pool()   # one Process per CPU
        for output in pool.map(calc, [1,2,3]):
            print 'output:',output
    

    输出

    output: 2
    output: 4
    output: 6
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-18
      • 2019-08-14
      • 2017-12-13
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 2018-02-14
      相关资源
      最近更新 更多