Fortran &引用;“通用”没有特定的子例程;MPI_发送和MPI_接收错误
我已经安装了OpenMPI,它与一个简单的并行hello world程序一起工作,但是当调用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,
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
)。