在Fortran中将MPI_时间与MPI_测试一起使用时出错

在Fortran中将MPI_时间与MPI_测试一起使用时出错,fortran,mpi,Fortran,Mpi,我正在为Fortran mpi程序编写一个异步负载平衡器。我使用MPI_TESTANY检查MPI_IRECV调用的完整性,并使用MPI_WTIME测量执行时间。 您可以在以下位置找到完整的代码: 下面给出了第207到217行,我在那里遇到了这个奇怪的问题 ... ELSE IF(PENDING_RECVS .GT. 0) THEN PRINT *,'8ST:', START_TIME(1),' TASK:',TASK CALL MPI_TESTANY

我正在为Fortran mpi程序编写一个异步负载平衡器。我使用MPI_TESTANY检查MPI_IRECV调用的完整性,并使用MPI_WTIME测量执行时间。 您可以在以下位置找到完整的代码:

下面给出了第207到217行,我在那里遇到了这个奇怪的问题

           ...
    ELSE IF(PENDING_RECVS .GT. 0) THEN
    PRINT *,'8ST:', START_TIME(1),' TASK:',TASK
    CALL MPI_TESTANY(NUMTASKS-1,REQUEST_RECV_RES,
 &          TASK,RECV_TEST_FLAG,STATUS_RECV_RES,IERR)

        IF (IERR .NE. MPI_SUCCESS) THEN
          PRINT *,'ERROR IN WAIT FOR RECV RESPONSE. TERMINATING.'
          CALL MPI_ABORT(MPI_COMM_WORLD, 1, IERR)
        END IF
        PRINT *,'9ST:', START_TIME(1),' TASK:',TASK
           ...
上述代码的输出如下:(用于两个进程)

6ST:1388151838.3635089
7ST:1388151838.3635089
第一:1388151838.3635089
8ST:1388151838.3635089任务:1
9ST:6.2921131024483548E-316任务:1

10ST:6.2921131024483548E-316
11ST:6.2921131024483548E-316

在第8次打印和第9次打印之间,开始时间(1)变量已更改!。我尝试更改开始时间变量的名称和位置,怀疑缓冲区溢出,但结果没有改变


任何帮助都将不胜感激。

始终使用
隐式无
,以强制编译器检查所有变量是否已显式声明

STATUS\u RECV\u RES
没有显式声明,因此编译器创建一个隐式
REAL
变量。由于
REAL
的长度不足以容纳整个整数MPI状态数组,因此当
MPI\u TESTANY
找到已完成的请求时,堆栈的一部分将被覆盖。恰好编译器将
START\u TIME
数组放置在
STATUS\u RECV\u RES
附近,前者的第一个元素被覆盖而成为牺牲品


此外,大多数编译器不会按照声明的顺序放置堆栈变量(或任何变量)。这通常是出于性能原因和校准要求而进行的。

这确实有效。这是一个惨痛的教训,忘记
隐式无
,这是一个严重的错误。非常感谢你的解释性回答。