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_发送和MPI_接收错误_Fortran_Mpi - Fatal编程技术网

Fortran &引用;“通用”没有特定的子例程;MPI_发送和MPI_接收错误

Fortran &引用;“通用”没有特定的子例程;MPI_发送和MPI_接收错误,fortran,mpi,Fortran,Mpi,我已经安装了OpenMPI,它与一个简单的并行hello world程序一起工作,但是当调用MPI\u SEND()或MPI\u RECV()时,它就不工作了。我正在使用gfortran 5.1和OpenMPI 3.0.1rc4 错误是 错误:在上没有通用“mpi_recv”的特定子例程 (一) 编译器似乎无法识别基本的子例程,例如MPI\u RECV() 这是导致错误的测试程序: program main use mpi implicit none integer :: ierr,np,

我已经安装了OpenMPI,它与一个简单的并行hello world程序一起工作,但是当调用
MPI\u SEND()
MPI\u RECV()
时,它就不工作了。我正在使用gfortran 5.1和OpenMPI 3.0.1rc4

错误是

错误:在上没有通用“mpi_recv”的特定子例程 (一)

编译器似乎无法识别基本的子例程,例如
MPI\u RECV()

这是导致错误的测试程序:

program main

use mpi

implicit none

integer :: ierr,np,myid,i,rbuf

integer, dimension(:,:), allocatable :: ista

CALL MPI_INIT(ierr)

CALL MPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr) 

CALL MPI_COMM_SIZE(MPI_COMM_WORLD,np,ierr) 


allocate(ista(MPI_STATUS_SIZE,np))


if (myid==0) then

   do i = 1, np-1

        CALL MPI_RECV(rbuf,1,MPI_INTEGER4,i,i,MPI_COMM_WORLD,ista,ierr)

        write(*,"('process ',i2,' sent:',i2)") i,rbuf

     end do

else

     i=10*myid

     CALL MPI_SEND(i,1,MPI_INTEGER4,0,myid,MPI_COMM_WORLD,ierr)

end if

CALL MPI_FINALIZE(ierr)

end program main

status参数是一个
整数(MPI\u status\u SIZE)
,您传递了声明为2D数组的
ista
,这就是编译器抱怨的原因。

status参数是一个
整数(MPI\u status\u SIZE)
,您传递了声明为2D数组的
ista
,这就是编译器抱怨的原因。

另一个可能更接近代码初衷的选项是传递所有状态数组的相应子数组
ista(:,i)

    CALL MPI_RECV(rbuf,1,MPI_INTEGER4,i,i,MPI_COMM_WORLD,ista(:,i),ierr)

或者只使用
MPI\u STATUS\u IGNORE
,我认为这是最好的选择。

另一个可能更接近代码初衷的选项是传递所有状态数组的相应子数组
ista(:,I)

    CALL MPI_RECV(rbuf,1,MPI_INTEGER4,i,i,MPI_COMM_WORLD,ista(:,i),ierr)


或者只使用
MPI\u STATUS\u IGNORE
,我认为这是最好的方法。

这是因为您使用与签名不匹配的参数调用子例程。发布一篇文章,这样我们可以看一看。我添加了一个不起作用的测试程序。这有帮助吗?这是因为您正在使用与签名不匹配的参数调用子例程。发布一篇文章,这样我们可以看一看。我添加了一个不起作用的测试程序。它有用吗?那么我应该如何修改测试?你不是说
integer(mpi\u status\u size)
意义上的
integer(kind=mpi\u status\u size)
?@francescalus不,它确实是一个数组。那么我应该如何修改测试?你不是说
integer(mpi\u status\u size)
意义上的
integer(kind=mpi\u status\u size)
?@francescalus不,它确实是一个数组。很好的一点,如果不使用状态,那么
MPI\u status\u IGNORE
是最佳选择!是的,应该是这样。它可以编译,但运行时会显示:主作业正常终止,但1个进程返回了非零退出代码。根据用户指示,作业已中止。@VladimirF您知道吗?您的程序不会在我的计算机上崩溃。你可以问一个新问题。确保代码准确无误,并显示完整的输入。使用您拥有的所有错误检查选项进行编译(例如,
mpif90-g-fcheck=all-Wall
)。如果不使用状态,那么
MPI\u status\u IGNORE
是最佳选择!是的,应该是这样。它可以编译,但运行时会显示:主作业正常终止,但1个进程返回了非零退出代码。根据用户指示,作业已中止。@VladimirF您知道吗?您的程序不会在我的计算机上崩溃。你可以问一个新问题。确保代码准确无误,并显示完整的输入。使用您拥有的所有错误检查选项进行编译(例如,
mpif90-g-fcheck=all-Wall
)。