在程序中更改本地分配的 MPI 内存

Change locally allocated MPI memory in program

我有一个 M x N 数组 'A',要在第二维使用 MPI 分布在 'np' 个处理器上(即 N 是分散的方向)。每个处理器最初将由 fftw_mpi_local_size_2D 分配 M x N/np 内存(我从 mpi 使用了这个函数,因为根据 fftw3 手册,SIMD 是高效的)。

初始化: alloc_local=fftw_mpi_local_size_2d(M,N,MPI_COMM_WORLD,local_n,local_n_offset) pointer1=fftw_alloc_real(alloc_local) 调用 c_f_pointer(pointer1,A[M,local_n])

此时,每个处理器都有一个 A 的 slab,大小为 M x local_n=(N/np)。

做傅立叶变换时:A(x,y) -> A(x,ky),这里y在数组A中垂直向下(不是MPI分区轴)。傅立叶space我必须存储 M+2 x local_n 个元素(对于长度为 M 的一维实数数组,如果我们使用 FFTW3 dfftw_execute_dft_r2c, ).

这些傅立叶 space 运算我可以在每个处理器的虚拟矩阵中独立完成。

有一种操作,我必须连续进行 y 傅立叶和 x 傅立叶余弦变换。为了在全傅立叶 space 中并行化操作,我想收集我的 y 傅立叶变换数组,这些数组的大小为 (M+2)xlocal_n 到 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) 开始,因为这会增加很多数组的内存需求,并且上述体操必须每次迭代只完成一次。

不,您不能轻易更改 Fortran 数组的分配大小(MPI 在这里不起作用)。您可以做的是为接收缓冲区使用不同的数组,释放数组并使用新的大小分配它,或者首先使用足够大的大小分配它。在不同的情况下会有不同的选择。如果没有看到您的代码,我会选择第一个,但不能排除最后一个。

请注意,FFTW3 具有内置的并行(一维 MPI 分解,这是您使用的)变换,包括多维变换。