(1)的通用'mpi_scatterv'没有特定的子程序

时间:2017-11-07 22:25:11

标签: fortran mpi gfortran openmpi windows-subsystem-for-linux

我的系统是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的服务器上编译。没有错误并且运行良好。

你能帮我解决这个问题吗?我搜索了几天。

1 个答案:

答案 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

正如您所看到的,SENDCOUNTSDISPLS是数组。他们表示

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的值未定义。必须修复上述错误。