提高与多处理并行求解线性系统的性能

时间:2014-04-01 14:01:28

标签: python parallel-processing multiprocessing sparse-matrix

当求解抛物型偏微分方程的耦合系统时,我需要在每个时间步骤中求解线性系统。通过使用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()

1 个答案:

答案 0 :(得分:0)

1)考虑numexpr - 这会并行评估函数。把它想象成scipy的延伸。

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

向其他进程发送/接收数据的开销很大,因此每个进程应尽可能少地进行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