分析函数和线性代数中的大量计算

时间:2017-03-30 09:54:04

标签: numpy blas scientific-computing numexpr

对于光波前传播中的非标准计算,我需要处理非常大的矩阵(大约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。但是,我没有在上面的代码中包含此过程,以便将注意力集中在主要问题上。

这里有两个耗时的操作:

  1. 计算内核
  2. 矩阵向量乘法
  3. 到目前为止,我使用numexpr来加速内核计算。因此,这部分利用了多核架构(当前机器:AMD FX 8320,8核,16 GB RAM)。但是,矩阵向量乘法不是。另外,我没有编译numpy来调整它到我的机器。这样,一次性(涉及数百次此类操作)需要几天时间!

    我想,进一步的并行化是减少计算时间的可能性。但是,我是一个完整的并行化初学者。谷歌搜索这个主题导致整个动物园的可能性和(作为初学者)很难判断要遵循的路线。

    你能否推荐一些BEGINNER可以访问的加速程序(特别是涉及并行化)?

1 个答案:

答案 0 :(得分:1)

你能做这样的事吗?

x = np.linspace(-Nx / 2, Nx / 2 - 1, Nx) * deltax
q = np.linspace(-Nq / 2, Nq / 2 - 1, Nq) * deltaq
u = np.empty_like(u0)
for i in np.arange(Nx).flat:
    u[i] = np.dot(np.exp(1j * 2 * np.pi * q * x[i]), u0)

它会慢于矢量化(因为你逐行计算你的内核)但不应该溢出你的记忆