我正在编写一个代码,我们最终计划将其扩展到 10 或 100 的数千个处理器(使用 MPI)。我有一个单独的 HDF5 文件(网格节点和连接性等),需要读取该文件并将其分发给具有相同数据的每个进程。这仅在代码的设置部分执行一次。当前的解决方案是让每个进程独立读取文件,但我的合作者担心这不会很好地扩展,并建议让进程 0 读取文件,然后 MPI 将数据分发给其他处理器。因此,我想从具有更丰富 HPC 经验的人那里获得外部意见。这真的会成为一个重要的瓶颈吗?
许多处理器读取单个 HDF5 文件
它不会扩展!使用并行 HDF5功能与相对较少的阅读器并行阅读它,或者按照您同事的建议执行。这两种方法都需要权衡取舍,您必须进行一些调整。这在很大程度上取决于文件有多大、有多少任务读取它、底层文件系统是什么(GPFS、Lustre 等)、文件是如何条带化的,以及底层磁盘基础设施是什么。
如果您的问题是“在使用分布式文件系统的大型集群的处理器”我肯定不会回答!(正如比尔在另一个答案中已经指出的那样。)
GPFS、Lustre 或 NFS 并不是为了替代分布式内存/MPI 编程范例中的高效内存/通信组织。但我的实际答案是:为什么要现在打扰?当然,渐近线反对在每个处理器上重新读取数据,但如果这成为真正的瓶颈,只能通过实验或更彻底的分析来确定,我们没有从你的帖子中获得足够的数据。
正如 Stali 在评论中指出的那样,也许您在内存限制之前达到了内存限制,或者数据读取时间在您的实际应用程序中仍然可以忽略不计,其中可能很大,但仍然有界。也许是应用程序的扩展性不太好......
我的 1 美分意见:仅当您的分析/时间显示您有一个真正的瓶颈时才进行优化。
编辑
不知何故,违背我的意愿,我的回答引发了一场评论战。明确一点:我完全同意让进程同时读取同一个文件。但是当 OP 说“我们最终计划扩展到 10 或 100 的数千个处理器”时,我理解“最终”的意思是“在未指定的稍后时间”。在达到这些极端数字之前,有很多工作可以通过更简单(尽管效率低下甚至是陈旧的)方法来完成。只是把事情放在正确的角度:在 2014 年 6 月的 500 强榜单中,“总核心数”列的中位数是 19280,所以运行意味着您可以访问一台真正大型机器的重要部分。
调整并行 I/O 需要大量工作,所以我的答案归结为非常古老的建议:“避免过早优化”……但在这里引发另一场战争的风险更大。
最后说明:如果您认为它毫无意义,请不要害怕投反对票。