【问题标题】:Change locally allocated MPI memory in program在程序中更改本地分配的 MPI 内存
【发布时间】: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 或类似工具,但很难说您的真正问题是什么。

标签: fortran mpi fftw


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2012-02-01
    • 2015-06-09
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多