我的系统是Windows上的Ubuntu Bash shell。
我使用gfortran GNU Fortran( Ubuntu 5.4.0-6ubuntu1~16.04.5 )5.4.0 20160609 和gcc版本5.4.0 20160609( Ubuntu 5.4.0-6ubuntu1~16.04.5 )。 和OpenMPI来编译文件。
旗帜是:
mpifort -ffree-form -g -fbacktrace -UREPSOILM -UNLDAS2 -c test-mpi.f90
PROGRAM test
USE MPI
IMPLICIT NONE
REAL, DIMENSION(2) :: xcug2m
INTEGER :: NODID, NUMPROCS, IERROR, COMM, DISPLS
REAL, DIMENSION(1) :: cug2m
INTEGER :: NPROCS=2, root
INTEGER :: SENDCOUNTS=1
INTEGER :: i
CALL MPI_INIT(IERROR)
CALL MPI_COMM_RANK(COMM, NODID, IERROR)
CALL MPI_COMM_SIZE(COMM, NUMPROCS, IERROR)
xcug2m = (/1,2/)
do i = 1,2
CALL MPI_SCATTERV(xcug2m(i), SENDCOUNTS, DISPLS, MPI_REAL, &
cug2m, SENDCOUNTS, MPI_REAL, root, COMM, IERROR)
end do
END PROGRAM test
错误是:
CALL MPI_SCATTERV(xc(:,i,j ), SCOUNT, DISPLS, MPI_REAL, c(:,i ),
SCOUNT, MPI_REAL, 0, MPI_COMM_WORLD, IER)
1
Error: There is no specific subroutine for the generic ‘mpi_scatterv’ at (1).
我已阅读过MPI_scatterv的手册,但一无所获。语法没问题。我曾经在ifort和OpenMPI的服务器上编译。没有错误并且运行良好。
你能帮我解决这个问题吗?我搜索了几天。
答案 0 :(得分:0)
正如Gilles Gouaillardet在评论中已经指出的那样,有几个论点,应该是数组,但你在那里传递标量。
您声称已检查过OpenMPI手册。当我打开它时,我看到了
MPI_SCATTERV(SENDBUF, SENDCOUNTS, DISPLS, SENDTYPE, RECVBUF,
RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR)
<type> SENDBUF(*), RECVBUF(*)
INTEGER SENDCOUNTS(*), DISPLS(*), SENDTYPE
INTEGER RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR
正如您所看到的,SENDCOUNTS
和DISPLS
是数组。他们表示
sendcounts
Integer array (of length group size) specifying the number of elements to send to each processor.
displs Integer array (of length group size). Entry i specifies the displacement (relative to sendbuf) from which to take the outgoing data to process i.
它们必须是数组,否则程序不正确。
程序在我的电脑上崩溃了。我不会搜索为什么,这是不值得的。可能是因为root
的值未定义。必须修复上述错误。