Fortran错误:两个不相关的子例程调用之间的类型不匹配

问题描述

在我看来,这个Fortran MPI程序非常简单:

@Override
public void onDrawFrame(GL10 gl) {
    GLES20.glClear(GL_COLOR_BUFFER_BIT);


   
    vertexData.position(0);
    glVertexAttribPointer(aPositionLocation,POSITIO_COMPONENT_COUNT,GL_FLOAT,false,STRIDETEXTURE,vertexData);
    vertexData.position(TEXTURE_COMPONENT_COUNT);
    glVertexAttribPointer(textureCoordinateLocation,TEXTURE_COMPONENT_COUNT,vertexData);
    glEnabLevertexAttribArray(aPositionLocation);
    glEnabLevertexAttribArray(textureCoordinateLocation);
    GLES20.gluniform1i(textureUnitLocation,1);
    GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
    GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES,texture);
    glDrawArrays(GL_TRIANGLES,6);



    /* EGLCONTEXTSWITCH */


    storeRenderState();
    makeCurrent();
    GLES20.glViewport(0,640,480);
    GLES20.glClear(GL_COLOR_BUFFER_BIT);
    GLES20.gluseProgram(program);
    vertexData.position(0);
    glVertexAttribPointer(aPositionLocation,6);
    GLES20.glFinish();
    EGLExt.eglPresentationTimeANDROID(mEGLdisplay,mEGLSurface,System.nanoTime());
    EGL14.eglSwapBuffers(mEGLdisplay,mEGLSurface);
    drainEncoder(false);
    restoreRenderState();

}

但是它无法在GNU下的Cray平台上编译。返回的错误是:

program what

use mpi

integer(4),parameter :: ksp = 4
integer(4),parameter :: kdp = 8

integer(ksp) :: nreadslb
integer(ksp),ALLOCATABLE :: all_nreadslb(:)

real(kdp) :: compute_time
real(kdp),ALLOCATABLE :: all_compute_times(:)

integer(ksp) :: myrank

integer :: ierr

call mpi_init(ierr)


allocate(all_nreadslb(10),all_compute_times(10))

CALL MPI_GATHER(compute_time,1,&
             MPI_DOUBLE_PRECISION,all_compute_times,MPI_COMM_WORLD,ierr)
CALL MPI_GATHER(nreadslb,MPI_INTEGER4,&
             all_nreadslb,&
             MPI_COMM_WORLD,ierr)


call mpi_finalize(ierr)


end program

真正的出发点是,如果我注释掉第一个MPI_GATHER,则第二个编译就很好,而如果我注释掉第二个MPI_GATHER,则第一个编译就很好。 GNU编译器不喜欢将两者都包含在代码中。仅出于笑容,我在它们之间放了一条调试语句。有同样的错误。该代码在Cray或Intel Fortran下可以正常编译。

任何想法可能是什么问题?

编辑:我正在使用Cray环境PrgEnv-gnu / 6.0.9,该环境使用来自gcc 10.1.0的gfortran和Cray MPICH 7.7.16。我正在使用Cray“ ftn”命令进行编译,没有标志,仅 23 | CALL MPI_GATHER(compute_time,& | 2 ...... 26 | CALL MPI_GATHER(nreadslb,& | 1 Error: Type mismatch between actual argument at (1) and actual argument at (2) (INTEGER(4)/REAL(8)). 。还发现问题出在gcc 10.1.0;代码在9.3.0下可以正常编译。这样就解决了眼前的问题。但是,如果有人知道在10.1.0下做什么(因为9.3.0不会永远持续下去),您一定会喜欢它!谢谢。

解决方法

无需详细说明是否应接受示例程序或为什么要接受该示例程序,因为这取决于Fortran语言版本以及所使用的MPI模块GCC 10 brings stricter type checking for Fortran procedure arguments的详细信息。通过将-fallow-argument-mismatch选项添加到编译命令行中,您应该能够将这些特定的错误转换为警告。这对其他项目(例如NetCDF)有效。