首页 > 解决方案 > 如何并行化 np.matmul 和 np.multiply?

问题描述

我有一个关于使用 numpy 进行矩阵计算的问题。如何并行化这些计算,例如np.matmulnp.multiply?我找不到任何描述如何使用并行化计算 np.matmul 的参考资料。

def time_shift_R(V, R_1, I0, t): # V is the potential function which returns an array
    temp1 = V(xx, yy, t) + B*I0**2 
    temp = P*np.matmul(M, I0) + Q*np.matmul(I0, M) - np.multiply(temp1, I0)
    R1 = ( R_1 - dt*temp ) / ( 1 - dt*B*R_1*I0 ) 
    return R1

我提前感谢您的帮助。

标签: pythonnumpyparallel-processing

解决方案


您可能需要做一些时间测试,看看究竟是什么花费了最多的时间。例如,在一台配备 Ubuntu linux 的相当普通的机器上:

制作一个复杂的数组(你没有引用任何大小,所以我只是猜测一些合理的东西):

In [60]: A = np.ones((1000,1000),complex)

multiply和运算符 * 基本相同:

In [61]: timeit A*A
7.49 ms ± 4.99 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [62]: timeit np.multiply(A,A)
7.48 ms ± 6.72 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

matmul是相当长一点,但后来它做的更多。更快的 BLAS 等效项可能会有所帮助。Notematmul足够聪明,可以为转置案例使用专门的 BLAS 函数。@ 运算符基本相同。

In [63]: timeit np.matmul(A,A)
381 ms ± 8.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [64]: timeit np.matmul(A,A.T)
231 ms ± 9.84 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

和功率计算:

In [65]: timeit 10.0*A**2
14.4 ms ± 1.19 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)

V(xx, yy, t)是未知的。


推荐阅读