更改程序

时间:2018-11-25 22:54:48

标签: fortran mpi fftw

我有一个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)     指针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个元素的数量(对于长度为1d的实数数组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)开始,因为这会增加很多数组的内存需求,并且上述操作每次迭代仅需执行一次

A schematic explaining the steps above. Might be replacement for text

1 个答案:

答案 0 :(得分:1)

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

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