【发布时间】:2013-08-14 01:16:41
【问题描述】:
我正在尝试使用MPI_Bcast 将 3D 数组传递给所有其他进程(在 FORTRAN 77 中)。 v1 是一个普通的块数组。我也不确定是否需要将公共数组v1 的计算值广播给所有其他进程,否则它们会因为通用而在每个进程中更改。以下是相关代码:
parameter (nprocz=48,nzro=1)
do i=i101,i102
dist = 0.015*float(i-iv0)
adamp = exp(-dist*dist)
do j = je0, je1-1
do k = ke0, ke1
v1(k,j,i) = v1(k,j,i)*adamp
end do
end do
end do
nmpi01=floor((iv0-ie0-nzro)/(nprocz-1))
if (mpirank .le. nprocz-2) then
i101=ie0+(mpirank*nmpi01)
i102=ie0+(mpirank+1)*nmpi01-1
else
i101=ie0+(mpirank*nmpi01)
i102=iv0-1
endif
MPI_Bcast(v1(:,:,i101:i102),(ke1-ke0+1)*(je1-je0)*(i102-i101+1)
& ,MPI_FLOAT,mpirank,MPI_COMM_WORLD,ierr01)
我收到错误消息:
PGFTN-S-0081-Matrix/vector v1 illegal as subprogram argument
传入的数组大小是正确的。有什么意见吗?
我更正了代码并遍历了排名并计算了每个排名中 rcount 和 displs 的所有元素:
integer :: myscount, myi101
do rank = 0, nprocz-1
nmpi01=floor((iv0-ie0-nzro)/(nprocz-1))
if (rank .le. nprocz-2) then
i101=ie0+(rank*nmpi01)
i102=ie0+(rank+1)*nmpi01-1
else
i101=ie0+(rank*nmpi01)
i102=iv0-1
endif
scount=(i102-i101+1)*(je1-je0)*(ke1-ke0+1)
rcount(rank+1)=scount
displs(rank+1)=rank*scount+1
if (rank .eq. mpirank) then
myscount = scount
myi101 = i101
end if
end do
scount = myscount
i101 = myi101
call mpi_allgatherv(...)
但仍然是错误的结果。 1-在我的情况下,每个部分的结果都用于下一部分,尤其是在mpi_allgatherv之后。所以我需要在每个mpi_allgatherv之后添加mpi_barrier吗? 2-应该使用 mpi_in_place 吗?考虑我只有一个 3d 数组 v1,每个子数组 v1(1,1,i) 是由某个过程计算的,我想将计算的子数组放在同一数组的适当部分。 3-我想我应该有displs(i) = sum(rcount(1:i-1))+1 for i=>2 考虑到在 fortran77 中总是 displs(1)=1。所以我更正了这个:循环之前displs(1)=1,循环内部displs(rank+2)=rank*scount+1和循环之后displs(nprocz+1)=0。我说的对吗?
【问题讨论】:
-
你能展示最小的完整代码示例来演示这个问题吗?请注意,我并没有说,将您的所有代码复制并粘贴到问题中,因为这对我们来说太多了,无法解析。当您提供更好的信息时,您可能会找到问题的答案。
-
wesley 我编辑了我的帖子。感谢您的任何评论
-
如果你
CALL MPI_Bcast(...)会发生什么? -
@IRO-bot 为什么打电话?那不是子程序。我试图删除 mpi_bcast 看看会发生什么。数组 v1 是一个公共块数组,对每个进程都是全局的。但仍然不确定我是否使用每个进程计算该数组的某个部分,该部分的更改将在其他进程中进行。你怎么看
-
是的,在 Fortran 中,所有 MPI 例程都是子例程。您使用什么 MPI 实现?
MPI_FLOAT作为一种数据类型看起来也很奇怪,请参阅 computing.llnl.gov/tutorials/mpi/#Derived_Data_Types。在您的情况下,对MPI_Bcast的调用将从根进程mpirank向所有其他进程发送v1的一部分。v1必须在所有进程上声明。如何使用MPI_Bcast,请参阅open-mpi.org/doc/v1.7/man3/MPI_Bcast.3.php。
标签: fortran mpi fortran-common-block