将3D阵列的外层重塑为1D阵列

时间:2014-02-06 07:01:59

标签: arrays parallel-processing fortran mpi

我有一个3D数组,如msh(0:m+1,0:n+1,0:l+1),它可以代表笛卡尔网格。 我想将外层重塑为1D数组。什么是最好的方法(从记忆的角度来看效率很高)?

目前我将从-z,+ z开始逐行重塑:

array(1:m*n)=reshape(msh(1:m,1:n,0),m*n)   
array(m*n+1:2*m*n)=reshape(msh(1:m,1:n,l+1),m*n) 

我的第一个问题是天气这种重塑是以记忆效率的方式完成的!或者还有其他方法,比如使用do循环更快,内存效率更高(数组的大小很大)。

其次,如果我在不同处理器中有多个这些数组,那么使用rank=0在主节点(例如MPI)中收集这些外层的最佳方法是什么。

1 个答案:

答案 0 :(得分:0)

这是一个O(2*m*n+2*l*m+2*l*n)问题,但是一个选项会做一系列循环:

allocate(array(2*m*n+2*l*m+2*l*n))
h = 1
do j=1,n
   do i=1,m
      array(h) = msh(i,j,0)
      array(h+m*n+1) = msh(i,j,l+1)
      h = h+1
   enddo
enddo
do k=1,l
   do i=1,m
      array(h) = msh(i,0,k)
      array(h+m*l+1) = msh(i,n+1,k)
      h = h + 1
   enddo
enddo
do k=1,l
   do j=1,n
      array(h) = msh(0,j,k)
      array(h+l*n+1) = msh(m+1,j,k)
      h = h + 1
   enddo
enddo

然后使用普通的mpi子程序将array传递给master