当求解抛物型偏微分方程的耦合系统时,我需要在每个时间步骤中求解线性系统。通过使用IMEX方法,我可以并行解决这些线性系统,只需更新每个时间步的右侧。
我的尝试是使用来自multiprocessing
的稀疏矩阵和来自scipy.sparse
的稀疏求解器的工作池。不幸的是,并行求解方程并不是那么快。
矩阵Mat1
,Mat2
,Mat3
和Mat4
适用于所有时间步长相同的矢量b1
,b2
, b3
和b4
必须在每个时间步骤中更新并相互依赖,即我有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()
答案 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