Skip to content

Instantly share code, notes, and snippets.

@bio-punk
Created March 8, 2026 15:53
Show Gist options
  • Select an option

  • Save bio-punk/ddcd2c55c3402c750cc45d2491e336ac to your computer and use it in GitHub Desktop.

Select an option

Save bio-punk/ddcd2c55c3402c750cc45d2491e336ac to your computer and use it in GitHub Desktop.
MaCOM #build

🌊 妈祖(MaCOM)海洋数值预报系统

—— 编译、调用与运行指南

版本:v5.4_code_ds_bar
研发单位:国家海洋环境预报中心(NMEFC)
用途:台风路径/强度预报、风暴潮预警、海浪预测、海洋温度/盐度/流场模拟
技术栈:WRF 扩展 + MPI 并行 + CUDA 加速 + NetCDF I/O


📌 1. 系统概述

“妈祖”是中国自主研发的高性能海洋数值预报系统,基于 WRF 模型扩展,支持:

  • ✅ 多尺度海洋模拟(全球 → 区域 → 近岸)
  • ✅ 台风路径与强度精准预报
  • ✅ 风暴潮与海浪联合预警
  • ✅ GPU 加速(NVIDIA Hopper 架构)
  • ✅ MPI 并行计算(支持数千核)

🛠️ 2. 编译依赖库(脚本 1)

📄 脚本文件:build_dependencies.sh

#!/bin/bash
set -e

PREFIX=/data/run01/dev260307/install
export PATH=${PREFIX}/bin:$PATH
export LIBRARY_PATH=${PREFIX}/lib:$LIBRARY_PATH
export LD_LIBRARY_PATH=${PREFIX}/lib:$LD_LIBRARY_PATH
export CPATH=${PREFIX}/include:$CPATH

# zlib
cd /data/run01/soft/zlib-1.2.11
rm -f ${PREFIX}/lib/libz.a ${PREFIX}/lib/libz.so* ${PREFIX}/lib/pkgconfig/zlib.pc
rm -f ${PREFIX}/include/zlib.h ${PREFIX}/include/zconf.h
rm -f ${PREFIX}/share/man/man3/zlib.3
module purge
CFLAGS="-fPIC -O2" ./configure --prefix=${PREFIX}
make clean && make -j8 && make install
echo "INFO: zlib built"

# HDF5
module load nvhpc/25.11-hpcx-cuda12
cd /data/run01/soft/hdf5-1.14.3
./configure --enable-parallel --with-zlib=${PREFIX} --prefix=${PREFIX} CC=mpicc
make clean && make -j8 && make install
echo "INFO: hdf5 built"

# NetCDF-C
cd /data/run01/soft/netcdf-c-4.9.3-rc2
export CPPFLAGS="-I${PREFIX}/include"
export LDFLAGS="-L${PREFIX}/lib"
if [ -f Makefile ]; then
  make distclean
  autoreconf -i --force
fi
./configure --prefix=${PREFIX} --disable-libxml2 --disable-dap --enable-static CC=mpicc
make clean && make -j8 && make install
echo "INFO: NETCDF-C built"

# NetCDF-Fortran
cd /data/run01/soft/netcdf-fortran-4.6.2
export CPPFLAGS="-I${PREFIX}/include"
export LDFLAGS="-L${PREFIX}/lib -Wl,-rpath,${PREFIX}/lib"
export LIBS="$(${PREFIX}/bin/nc-config --libs)"
export FCFLAGS="-fPIC"
export FFLAGS="-fPIC"
if [ -f Makefile ]; then
  make distclean
  autoreconf -i --force
fi
./configure --prefix=${PREFIX} --disable-libxml2 --disable-dap --enable-static CC=mpicc FC=mpif90
make clean && make -j8 && make install

nc-config --features

✅ 编译步骤:

  1. 确保已安装 nvhpc 编译器
  2. 设置 PREFIX 路径
  3. 依次编译 zlibHDF5NetCDF-CNetCDF-Fortran
  4. 所有库安装在 ${PREFIX} 目录下

🛠️ 3. 编译“妈祖”主程序(脚本 2)

📄 脚本文件:build_mazu.sh

#!/bin/bash

module load nvhpc/25.11-hpcx-cuda12

PREFIX=/data/run01/dev260307/install
export PATH=${PREFIX}/bin:$PATH
export LIBRARY_PATH=${PREFIX}/lib:$LIBRARY_PATH
export LD_LIBRARY_PATH=${PREFIX}/lib:$LD_LIBRARY_PATH
export CPATH=${PREFIX}/include:$CPATH

export NVCOMPILER_ACC_DEVICE=tesla:cc90
export NVCOMPILER_ACC_ARCH=sm_90

cd /data/run01/v5.4_code_ds_bar

make clean
make

✅ 编译步骤:

  1. 加载 nvhpc 模块
  2. 设置环境变量(PREFIX, NVCOMPILER_*
  3. 进入源码目录
  4. 执行 make clean && make

⚠️ 注意:

  • NVCOMPILER_ACC_DEVICE=tesla:cc90 表示使用 Tesla 架构,计算能力 9.0(Hopper)
  • NVCOMPILER_ACC_ARCH=sm_90 表示生成代码的目标架构为 SM_90

🚀 4. 运行“妈祖”(脚本 3)

📄 脚本文件:run_mazu.slurm

#!/bin/bash
#SBATCH -J whw
#SBATCH --gpus=6
#SBATCH -p gpu_a800

export HDF5_USE_FILE_LOCKING=FALSE 
export NC_ENABLE_NETCDF4=1 
export OMPI_MCA_io=ompio 
export MPI_UNBUFFERED_STDIO=1 

work_dir=`pwd`
cd ../MaCOM

module purge
module load nvhpc/25.11-hpcx-cuda12
PREFIX=/data/run01/dev260307/install
export PATH=${PREFIX}/bin:$PATH
export LIBRARY_PATH=${PREFIX}/lib:$LIBRARY_PATH
export LD_LIBRARY_PATH=${PREFIX}/lib:$LD_LIBRARY_PATH
export CPATH=${PREFIX}/include:$CPATH

cp /data/run01/v5.4_code_ds_bar/macom.exe .
mpirun --bind-to none -np 6 ./macom.exe 2

✅ 运行步骤:

  1. 提交 SLURM 作业
    sbatch run_mazu.slurm
  2. 请求资源
    • 6 个 GPU(--gpus=6
    • 使用 gpu_a800 分区
  3. 设置环境变量
    • HDF5_USE_FILE_LOCKING=FALSE:禁用 HDF5 文件锁,提高并行 I/O 性能
    • NC_ENABLE_NETCDF4=1:启用 NetCDF-4 支持
    • OMPI_MCA_io=ompio:使用 OMPIO 作为 MPI I/O 后端
    • MPI_UNBUFFERED_STDIO=1:禁用 MPI 标准输出缓冲
  4. 复制可执行文件
    cp /data/run01/v5.4_code_ds_bar/macom.exe .
  5. 启动 MPI 任务
    mpirun --bind-to none -np 6 ./macom.exe 2

⚠️ 注意:

  • --bind-to none:不绑定到特定 CPU,避免资源争抢
  • -np 6:启动 6 个 MPI 进程
  • 2:可能是“妈祖”的输入参数(如模式编号、时间步长等)

💡 5. 关键配置说明

变量 作用
PREFIX 依赖库安装路径
NVCOMPILER_ACC_DEVICE=tesla:cc90 指定 GPU 架构为 Tesla,计算能力 9.0
NVCOMPILER_ACC_ARCH=sm_90 指定生成代码的目标架构为 SM_90
HDF5_USE_FILE_LOCKING=FALSE 禁用 HDF5 文件锁,提高并行 I/O 性能
NC_ENABLE_NETCDF4=1 启用 NetCDF-4 支持
OMPI_MCA_io=ompio 使用 OMPIO 作为 MPI I/O 后端
MPI_UNBUFFERED_STDIO=1 禁用 MPI 标准输出缓冲,避免日志延迟

📚 6. 官方资源


🛡️ 7. 常见问题与解决方案

❗ 编译失败

  • 检查依赖库是否已正确安装
  • 确保加载了正确的 nvhpc 模块
  • 检查环境变量是否设置正确

❗ 运行失败

  • 检查 GPU 资源是否充足
  • 确保 macom.exe 已正确编译
  • 检查输入文件是否存在

❗ 日志无输出

  • 设置 MPI_UNBUFFERED_STDIO=1
  • 使用 sacct 查看作业状态

📝 8. 附录:快速参考表

操作 命令
编译依赖库 ./build_dependencies.sh
编译“妈祖” ./build_mazu.sh
提交作业 sbatch run_mazu.slurm
查看作业状态 squeue -u $USER
查看日志 cat slurm-*.out

✅ 9. 总结

“妈祖”是一个功能强大的海洋数值预报系统,适用于台风、风暴潮、海浪等海洋灾害预警。通过正确编译依赖库、配置环境变量、提交 SLURM 作业,你可以在 GPU 集群上高效

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment