【发布时间】:2019-04-27 14:37:06
【问题描述】:
我有一个 M x N 数组“A”,它将使用第二维中的 MPI 分布在“np”处理器上(即 N 是分散的方向)。 fftw_mpi_local_size_2D 最初会为每个处理器分配 M x N/np 内存(我使用了 mpi 的这个函数,因为 SIMD 根据 fftw3 手册是高效的)。
初始化: alloc_local=fftw_mpi_local_size_2d(M,N,MPI_COMM_WORLD,local_n,local_n_offset) 指针1=fftw_alloc_real(alloc_local) 调用 c_f_pointer(pointer1,A[M,local_n])
此时,每个处理器都有一个 A 的平板,大小为 M x local_n=(N/np)。
进行傅立叶变换时:A(x,y) -> A(x,ky),此处 y 在数组 A 中垂直向下(不是 MPI 分区轴)。在傅立叶空间中,我必须存储 M+ 2 x local_n 个元素(对于长度为 M 的一维实数数组,如果我们使用 FFTW3 dfftw_execute_dft_r2c 中的这个模块,傅立叶空间中的 M 有 M+2 个元素)。
我可以在每个处理器的虚拟矩阵中独立完成这些傅立叶空间运算。
有一个操作,我必须连续进行 y 傅立叶和 x 傅立叶余弦变换。为了并行化所有傅立叶空间中的操作,我想将 (M+2)xlocal_n 大小的 y 个傅立叶变换数组收集到 M+2 x N 更大的数组,并在转置后再次将它们分散回来,以便 y 方向是分区的一。即( N x M+2 ) ----scatter---> (N x (M+2)/np) 但每个处理器最初只分配了 M x local_n 地址。
如果我有 M=N,那么我仍然有 (N x local_n + (2/np)) 。我可以通过为 1 个处理器增加分配的内存来解决这个问题。
我不想从 (N+2,N) 和 (N+2,local_n) 开始,因为这会增加大量数组的内存需求,并且上述体操每次迭代只需执行一次.
【问题讨论】:
-
你是如何分配初始数组的?
-
我已将其添加到问题中
-
哪个索引是你的列?我认为您正在做的事情的代码(特别是从 128 到 130 的更改)可能是必要的。您可能可以简单地使用 Gatherv 或类似工具,但很难说您的真正问题是什么。