Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 在以下情况下使用MPI;根“;没有发送缓冲区_Fortran_Mpi - Fatal编程技术网

Fortran 在以下情况下使用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函数
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是的,分配到零大小并传递该值是合法的。这正是我所做的