首页 > 解决方案 > 如何使用 Chapel 并行 IO?

问题描述

我一直在 Chapel 中探索并行 IO。Chapel 文档提到了并行 IO 标志,并且通道可以并行工作。但是,我没有看到其他任何东西。

我没有特别的问题,只是想了解更多。

Chapel 团队或健全的 Chapel 从业者能否讨论适当使用 Chapel 并行 IO 范式的任何示例?

标签: chapel

解决方案


并行 I/O 对不同的人可能意味着不同的事情,这使得对这个问题有一个单一、简单的答案具有挑战性(尽管它可能建议 Chapel 项目应该在其文档中添加一个并行 I/O 登录页面,这将指向其他资源?)。例如,“并行 I/O”可能意味着:

  • 使用多个任务(在单个节点上或跨多个节点)写入单个文件
  • 使用多个任务写入多个文件
  • 使用某种并行文件系统

另一个重要因素是所需的文件格式:文本、二进制或特定文件格式,如 HDF5、NetCDF 等。

一般来说,在 Chapel 中进行并行 I/O 的显式方式是使用 Chapel 的语言特性来表达并行性(例如,、、或)创建多个任务coforallcobegin然后begin为每个任务提供自己的读取/写入通道至。如果所有通道都引用单个文件,则任务可能需要在它们之间进行协调,以确保它们正在写入/读取文件的不相交段。如果每个通道都引用其自己的文件,则无需进行此类协调。

在 Chapel 中获得并行 I/O 的另一种主要方法是隐式的,通过调用一个库例程,其中在例程本身内创建和管理并行性——或者使用上述在 Chapel 中编写的例程的技术,或者通过调用外部并行函数(例如,来自 C 库的并行 I/O 例程)。

最后,您可以创建多个同时调用串行(或并行)I/O 库例程的任务。

有关第一种显式方法的示例,请参阅我最近为回答类似问题而整理的这个示例程序。它声明一个二维数组,其行是块分布的,然后使用每个区域设置的任务(计算节点)将该区域设置的子数组写入单个/共享二进制格式文件。然后它执行类似的操作将数据读回第二个数组并验证两个数组是否匹配。在这两种情况下,每个任务都会将其通道推进到与它想要写入/读取的值相对应的适当文件偏移量。

基于库的并行 I/O 方法的示例包括hdf5WriteDistributedArray()例程,该例程在逻辑上与前面的示例非常相似,但使用的是 HDF5 文件格式。或者,readAllHDF5Files()例程是从多个文件并行读取的库例程的示例。

我认为可以肯定地说,Chapel 应该支持比现在更多的库例程来帮助并行 I/O。主要挑战是了解上述空间中哪些模式和格式对用户最重要。我们始终对这方面的请求和意见持开放态度。


推荐阅读