如何解决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)有效。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。