如何正确升级OpenMP版本且不破坏Ubuntu 16.04上的MPI配置?
问题拆解与解决方案
让我来帮你理顺这个问题——你遇到的是典型的「GCC/OpenMP版本兼容」+「MPI编译链版本匹配」的组合问题,咱们一步步来解决:
核心问题分析
- OpenMP版本不支持:Ubuntu 16.04默认的GCC 5.4仅支持到OpenMP 4.0,而你用到的数组归约、自定义归约运算符是OpenMP 4.5才引入的特性,这直接触发了编译报错。
- MPI与GCC版本不匹配:系统中原有的MPICH是用旧版GCC编译的,MPICH有严格的版本要求——编译用户MPI程序的GCC,必须和编译MPICH本身的GCC版本完全一致。你之前重装MPICH时应该没指定用新GCC编译,所以问题没得到解决。
解决方案:同步升级GCC与MPICH,匹配OpenMP 4.5需求
我们的思路是:先安装支持OpenMP 4.5的GCC版本,再用这个新GCC重新编译MPICH,最后调整CMake配置适配新工具链。
步骤1:安装支持OpenMP 4.5的GCC 7
Ubuntu 16.04可以通过官方PPA安装GCC 7(和你测试环境的7.5版本匹配):
# 添加toolchain源 sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update # 安装GCC7和G++7 sudo apt install gcc-7 g++-7
可以临时切换到新GCC(当前终端生效),或者设置为系统默认:
# 临时切换(推荐先临时测试,避免影响其他程序) export CC=/usr/bin/gcc-7 export CXX=/usr/bin/g++-7 # 可选:设置为系统默认GCC sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 100
步骤2:用新GCC重新编译安装MPICH
先卸载系统原有的MPICH,避免冲突:
sudo apt purge mpich libmpich-dev
然后从源码编译MPICH(确保用新GCC编译,版本建议和你之前使用的一致,比如3.3.2):
# 下载源码包 wget https://www.mpich.org/static/downloads/3.3.2/mpich-3.3.2.tar.gz tar xzf mpich-3.3.2.tar.gz cd mpich-3.3.2 # 配置编译参数,指定新GCC,安装到自定义目录 ./configure --prefix=/usr/local/mpich-gcc7 CC=gcc-7 CXX=g++-7 --enable-shared # 编译安装(-j后面的数字是CPU核心数,加快编译) make -j$(nproc) sudo make install
步骤3:配置环境变量,优先使用新MPICH
把新MPICH的路径添加到环境变量中,编辑~/.bashrc:
echo 'export PATH=/usr/local/mpich-gcc7/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/mpich-gcc7/lib:$LD_LIBRARY_PATH' >> ~/.bashrc # 生效配置 source ~/.bashrc
验证安装是否成功:
# 检查MPI编译器的GCC版本,应该显示gcc 7.5.0 mpicxx -v
步骤4:调整CMake配置适配新工具链
修改你的CMake配置,确保它找到新的GCC和MPICH:
- 运行CMake时直接指定工具链:
cmake .. -DCMAKE_C_COMPILER=gcc-7 -DCMAKE_CXX_COMPILER=g++-7 -DMPI_CXX_COMPILER=/usr/local/mpich-gcc7/bin/mpicxx
- 或者在
CMakeLists.txt中明确指定:
# 先指定新编译器 set(CMAKE_C_COMPILER gcc-7) set(CMAKE_CXX_COMPILER g++-7) # 查找MPI find_package(MPI REQUIRED) # 保留原有的MPI链接配置 link_libraries(${MPI_CXX_LIBRARIES}) if(MPI_CXX_COMPILE_FLAGS) set_property(GLOBAL PROPERTY COMPILE_FLAGS "${MPI_CXX_COMPILE_FLAGS}") endif() if(MPI_CXX_LINK_FLAGS) set_property(GLOBAL PROPERTY LINK_FLAGS "${MPI_CXX_LINK_FLAGS}") endif() # 务必添加OpenMP支持 find_package(OpenMP REQUIRED) if(OpenMP_CXX_FOUND) target_link_libraries(你的项目目标名称 PRIVATE OpenMP::OpenMP_CXX) endif()
常见问题排查
- 编译MPICH时如果出现依赖错误,比如缺少
libtool或make,执行:
sudo apt install build-essential libtool
- 如果CMake找不到新的MPI,可以手动指定
MPI_CXX_COMPILER路径为/usr/local/mpich-gcc7/bin/mpicxx。
内容的提问来源于stack exchange,提问作者browser-bug
相关产品推荐
相关产品推荐

