“没有针对MPI_SEND和MPI_RECV的通用”错误的特定子例程

时间:2018-03-16 13:10:07

标签: fortran mpi

我已经安装了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

2 个答案:

答案 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,我认为这是最好的。