对于光波前传播中的非标准计算,我需要处理非常大的矩阵(大约 10^6*10^6 个条目),这些矩阵不是稀疏的或以任何方式“可简化”的。
代码大致如下:
import numpy as np
x = np.linspace(-Nx / 2, Nx / 2 - 1, Nx) * deltax
q = np.linspace(-Nq / 2, Nq / 2 - 1, Nq) * deltaq
xg, qg =np.meshgrid(x, q)
kernel = np.exp(1j * 2 * np.pi * qg * xig)
u = np.dot(kernel, u0)
这里,Nx, Nq 是大数,deltax, deltaq 是比例因子,u0 是一个合适的向量。实际上,内核不是上面的傅里叶类型,而是更复杂。
当然,矩阵对于 RAM 来说太大了,所以整个过程必须分成更小的块。事实上,我计算内核的行块,然后做相应的点积,得到 u 块。但是,我没有在上面的代码中包含这个过程,以便将注意力集中在主要问题上。
这里有两个耗时的操作:
- 内核的计算
- 矩阵向量乘法
到目前为止,我使用 numexpr 来加速内核计算。因此,这部分使用了多核架构(当前机器:AMD FX 8320,8 核,16 GB RAM)。但是,矩阵向量乘法没有。另外,我没有编译 numpy 来将它调整到我的机器上。这样一来(涉及数百个这样的操作)需要几天时间!
我想,进一步的并行化有可能减少计算时间。但是,我是并行化的完整初学者。谷歌搜索这个主题会导致整个动物园的可能性,并且(作为初学者)很难判断要遵循哪条路线。
您能否推荐一些初学者可以访问的加速程序(特别是涉及并行化)?