我有一个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
)中收集这些外层的最佳方法是什么。
答案 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
。