源码编译PnetCDF 1.12.2时tst_rec_vars并行测试失败如何解决
故障原因
- PnetCDF 1.12.x版本的NetCDF4兼容层存在并行同步缺陷:多MPI进程写入带UNLIMITED维度的文件后,未添加跨进程的元数据全局同步屏障,导致部分进程读取维度长度时,拿到的是HDF5层未刷新的旧缓存数据,与实际写入的维度长度不符。单进程运行测试时不存在并行同步冲突,因此可以正常通过。
- 你使用的HDF5 1.8.22默认开启元数据延迟刷新策略,进一步放大了这个问题:测试用例写完数据后立刻执行读取校验,部分进程的本地元数据缓存还没同步所有进程的写入结果,就触发了校验逻辑,导致报错。
解决方案
- 方案1(推荐,不影响核心功能):跳过该测试用例直接安装。该测试仅为兼容层边缘场景校验,失败不影响PnetCDF的常规并行读写功能,
make check通过后直接执行make install即可正常使用。如果需要跑完全部测试,可以手动修改test/nc4/Makefile,将tst_rec_vars从测试列表中移除后再执行make ptest。 - 方案2:升级PnetCDF到1.13.0及以上版本,该版本官方已修复NetCDF4兼容层的并行元数据同步问题,可直接适配你当前的依赖版本。
- 方案3(保留1.12.2版本):编译PnetCDF时添加额外编译参数强制开启同步逻辑,configure命令调整为:
CFLAGS="-DH5_DO_NOT_PACK_HEADERS" ./configure --prefix=${DIR}/pnetcdf --enable-large-single-req --enable-netcdf4 --enable-shared=yes --enable-strict-sync --with-netcdf4="${DIR}/netcdf" MPICC=mpicc MPIF77=mpif77 MPIF90=mpif90
重新编译后即可通过测试。
- 方案4:降级NetCDF-C到4.7.4版本,该版本的并行元数据缓存刷新逻辑与PnetCDF 1.12.x完全兼容,不会触发该同步问题。
内容的提问来源于stack exchange,提问作者RogUE
相关产品推荐
相关产品推荐

