Windows下Intel OneAPI编译器启用64位Fortran编译的CMake配置问题
问题根因
Intel MPI针对Fortran提供两套独立的接口绑定:
- 默认LP64版本:对应32位整数,
MPI_INTEGER定义为4字节类型 - ILP64版本:对应64位整数,
MPI_INTEGER定义为8字节类型
你仅为自己的代码添加了-i8编译选项开启64位整数,但CMake的find_package(MPI)默认拉取的是LP64版本的MPI模块定义与库,所以代码中引用的MPI_INTEGER常量还是32位版本的定义,最终出现测试结果不符合预期的问题。
修复步骤
- 执行CMake构建前,先加载Intel OneAPI完整环境变量:运行Intel OneAPI安装目录下的
setvars.bat,确保I_MPI_ROOT等环境变量生效 - 在
CMakeLists.txt中调用find_package(MPI)之前,加入以下配置,强制CMake使用ILP64版本的MPI接口:
# 强制Fortran编译器使用64位整数 set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -i8" CACHE STRING "" FORCE) # 指定MPI头文件路径为ILP64版本 set(MPI_Fortran_ADDITIONAL_INCLUDE_DIRS "$ENV{I_MPI_ROOT}/include/ilp64" CACHE STRING "" FORCE) # 指定优先链接ILP64版本的MPI库 set(MPI_Fortran_LIBRARY_NAMES "libmpi_ilp64.lib" "impi.lib" CACHE STRING "" FORCE)
- 清理原有CMake构建缓存,重新生成构建文件,构建时添加
VERBOSE=1参数确认编译命令行中包含-I${I_MPI_ROOT}/include/ilp64参数,确保引用的是ILP64版本的mpi.mod模块文件
验证方法
在测试代码中新增以下打印逻辑,确认MPI_INTEGER的类型精度符合预期:
print *, 'kind(MPI_INTEGER) = ', kind(MPI_INTEGER)
输出为8即为ILP64模式配置生效。
内容的提问来源于stack exchange,提问作者Vishy
相关产品推荐
相关产品推荐

