Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Numpy 解析函数和线性代数中的繁重计算_Numpy_Blas_Scientific Computing_Numexpr - Fatal编程技术网

Numpy 解析函数和线性代数中的繁重计算

Numpy 解析函数和线性代数中的繁重计算,numpy,blas,scientific-computing,numexpr,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

对于光学波前传播中的非标准计算,我需要处理非常大的矩阵(大约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来调整它以适应我的机器。这样一来,一次行动(涉及数百次此类行动)需要几天时间

    我想,进一步的并行化有可能减少计算时间。然而,我是一个完全的并行化初学者。用谷歌搜索这个话题会导致一大堆可能性,而且(作为初学者)很难判断该走哪条路


    您能推荐一些初学者可以使用的加速程序(特别是涉及并行化的加速程序)吗?

    您能这样做吗

    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)
    

    它将比矢量化的速度慢(因为您正在逐行计算内核),但不应该使内存溢出

    是否有任何理由不逐项计算
    u
    ,或者至少在块中计算?事实上,这就是我为防止RAM耗尽所做的基本工作。然而,我不是一行一行地做这件事,而是一行一行地做。为了从numpy向量运算中获益,这些行块被选得尽可能大。这可能是你最好的选择。我编辑了我的原始帖子,从一开始就把这一点讲清楚了。