Fortran 在以下情况下使用MPI;根“;没有发送缓冲区
我想使用MPI函数Fortran 在以下情况下使用MPI;根“;没有发送缓冲区,fortran,mpi,Fortran,Mpi,我想使用MPI函数MPI\u GATHERV,其中每个MPI列组都有一个大小不同的缓冲区,需要在根进程中收集。 我的根进程将只收集缓冲区,但与往常一样,它本身没有发送缓冲区 例如 RANK1 buf_sz =3 buf(1) = 1 buf(2) = 2 buf(3) = 3 排名2 buf_sz =3 buf(1) = 4 buf(2) = 5 buf(3) = 6 在MPI_GATHERV之后,我的根应该 buf(1) = 1 buf(2) = 2 bu
MPI\u GATHERV
,其中每个MPI列组都有一个大小不同的缓冲区,需要在根进程中收集。
我的根进程将只收集缓冲区,但与往常一样,它本身没有发送缓冲区
例如
RANK1
buf_sz =3
buf(1) = 1
buf(2) = 2
buf(3) = 3
排名2
buf_sz =3
buf(1) = 4
buf(2) = 5
buf(3) = 6
在MPI_GATHERV之后,我的根应该
buf(1) = 1
buf(2) = 2
buf(3) = 3
buf(4) = 4
buf(5) = 5
buf(6) = 6
现在,这意味着在根目录下,我必须应用一个sendbuf,它被分配了零个元素和零个计数。我不确定这通常有多明确和安全
示例代码
if(myrankid == root)then
allocate(displ(3))
allocate(counts(3))
displ(1) = 0
displ(2) = 0
displ(3) = 3
counts(1) = 0
counts(2) = 3
counts(3) = 3
allocate(buf_send(0))
sendcount = 0
allocate(recvbuf(6))
else
allocate(displ(1))
allocate(counts(1))
allocate(buf_send(3))
allocate(recvbuf(1))
sendcount = 3
endif
MPI_Gatherv(buf_send, sendcount, mpi_integer,&
recvbuf, counts, displs,&
mpi_integer, root, mpi_comm_world)
(将我的评论变成回答)
是的,分配到零大小并传递它是合法的。这正是我所做的向我们展示您的代码。您的代码有什么问题吗?我的问题是使用零计数和分配有零元素的缓冲区是否安全。当我阅读周围的答案是混合在这方面。所以我想知道这是否可行,或者我应该寻找一个不同的解决方案。正如您在我的示例中所看到的,我使用一个元素为其他列组分配计数和显示,这样做只是为了避免使用未分配数组时可能出现的任何问题。从本质上讲,这两个数组对于其他秩来说并不重要,除了root@GillesGouaillardet-100%不同意。如果对应的伪参数没有allocatable属性,则传递未分配的可分配数组始终是非标准的。这完全与被调用例程是否访问参数无关。由于MPI没有带有allocatable属性的参数,因此MPI调用总是非法的,在上述情况下,调用例程应该分配到零大小。@A2LBK是的,分配到零大小并传递该值是合法的。这正是我所做的