libhdf5通过分布式srun创建无效的HDF5文件
通过Slurm跨越计算集群的多台节点执行时,Parallel HDF5的表现会异常。
请考虑以下的最小工作示例(MWE),它在C++的 libhdf5中使用来创建一个空但有效的HDF5文件:
#include <stdio.h>
#include <string>
#include <hdf5.h>
int main(int argc, char ** argv) {
const std::string filename = "example.h5";
MPI_Init(&argc, &argv);
MPI_Barrier(MPI_COMM_WORLD);
hid_t plist_id = H5Pcreate(H5P_FILE_ACCESS);
MPI_Barrier(MPI_COMM_WORLD);
H5Pset_fapl_mpio(plist_id, MPI_COMM_WORLD, MPI_INFO_NULL);
MPI_Barrier(MPI_COMM_WORLD);
hid_t file_id = H5Fcreate(filename.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, plist_id);
MPI_Barrier(MPI_COMM_WORLD);
H5Pclose(plist_id);
MPI_Barrier(MPI_COMM_WORLD);
H5Fclose(file_id);
MPI_Barrier(MPI_COMM_WORLD);
MPI_Finalize();
return 0;
}
(我在代码中混入了 MPI_Barrier,只是为了演示我的问题并不是一个MPI同步问题。)
代码可以编译。执行时,输出看起来符合预期:
$ mpirun -n 2 ./a.out && h5dump example.h5
HDF5 "example.h5" {
GROUP "/" {
}
}
这始终如一地发生,成功率为100%。
现在我连接到一个由Slurm管理的集群。我把 mpirun 替换成 srun:
$ srun -n 2 ./a.out && h5dump example.h5
HDF5 "example.h5" {
GROUP "/" {
}
}
仍然一切正常,可靠地成功——前提是作业的所有进程都被调度在同一个计算节点上。
然而,我们现在让执行跨越多台机器。于是得到的HDF5文件有时会被损坏(大约一半的情况):
$ srun -n 2 --ntasks-per-node=1 ./mwe_bin && h5dump example.h5
HDF5 "example.h5" {
GROUP "/" {
}
}
$ srun -n 2 --ntasks-per-node=1 ./mwe_bin && h5dump example.h5
h5dump error: unable to open file "example.h5"
如何在对libhdf5进行分布式调用的情况下,可靠地创建一个HDF5文件?
一些背景信息:该文件要通过NFS写入到文件服务器上。我知道NFS并不满足并行文件系统的MPI-IO标准。但在我们的集群上,日常就有并行HDF5 I/O的服务,包括其他链接到相同libhdf5的应用,已经多年没有问题。我相信,上述MWE中一定存在某种设计上的错误决策,能够解释单节点与多节点之间分布式行为的显著差异。
解决方案
这完全是NFS的问题。你的MPI-IO实现是否支持NFS?例如ROMIO里有一些缓解措施,但即使如此也只是尽力而为。
你的代码是正确的。感谢提供这个简单的复现程序。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。