我已经安装了OpenMPI,它可以使用简单的并行化hello world程序,但是在调用MPI_SEND()
或MPI_RECV()
时它不起作用。我正在使用gfortran 5.1和OpenMPI 3.0.1rc4。
错误是
错误:通用的'mpi_recv'没有特定的子程序 (1)
编译器似乎无法识别基本子例程,例如MPI_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
答案 0 :(得分:1)
status参数是INTEGER(MPI_STATUS_SIZE)
,你传递ista
,它被声明为2D数组,这就是编译器抱怨的原因。
答案 1 :(得分:1)
另一个选项,也许更靠近代码的原始意图,是传递所有状态数组的相应子数组ista(:,i)
CALL MPI_RECV(rbuf,1,MPI_INTEGER4,i,i,MPI_COMM_WORLD,ista(:,i),ierr)
或者只使用MPI_STATUS_IGNORE
,我认为这是最好的。