【问题标题】:MPI one-sided file I/OMPI 单面文件 I/O
【发布时间】:2016-02-29 03:14:40
【问题描述】:

我对使用 MPI 执行文件 I/O 有一些疑问。

一组文件分布在不同的进程中。 我希望进程读取其他进程中的文件。

例如,在单向通信中,每个进程都会设置一个对其他处理器可见的窗口。我需要完全相同的功能。 (为所有文件创建“窗口”并共享它们,以便任何进程可以从任何偏移量读取任何文件)

在 MPI 中可以吗?我阅读了很多关于 MPI 的文档,但找不到确切的文档。

【问题讨论】:

  • “一组文件分布在不同的进程中”是什么意思?这是否意味着这些文件位于本地文件系统上,仅对给定的 MPI 进程挂载/可见,而不是另一个? (例如在不同计算节点的/tmp 上)
  • @Gilles 对,这意味着这些文件位于本地文件系统上,仅对给定的 MPI 进程挂载/可见,而不是其他进程。

标签: mpi


【解决方案1】:

简单的答案是您不能使用 MPI 自动执行此操作。

您可以通过看到MPI_File_open() 是一个集体调用来说服自己,它将内部通信器作为第一个参数并将文件处理程序返回到打开的文件作为最后一个参数。在此通信器中,所有进程都打开该文件,因此,所有进程都必须看到该文件。因此,除非进程看到文件,否则它无法获得MPI_file 处理程序来访问它。

现在,这并不意味着没有解决方案。一种可能性可能是完全按照您的描述手动完成,即:

  1. 每个 MPI 进程单独打开他们看到并负责的文件;那么
  2. 这些进程中的每一个都将此本地文件读入缓冲区;
  3. 这些单独的缓冲区全部公开,使用全局MPI_Win 内存窗口或几个单独的内存窗口,为单面读取访问做好准备;最后
  4. 对以前存储在这些单独的本地文件中的任何数据的所有读取访问现在都通过使用内存窗口的MPI_Get() 调用完成。

这种方法的真正局限性在于它需要完全读取所有单个文件,因此,每个节点都需要有足够的内存来存储每个文件。我很清楚这是一个非常非常大的警告,可能会使解决方案完全不切实际。但是,如果内存足够,这是一个简单的方法。

另一个更简单的解决方案是将文件存储到共享文件系统中,或者将它们全部复制到所有本地文件系统中。我想这不是一个选择,因为否则不会问这个问题......

最后,我看到的一种可能性是为每个节点指定一个 MPI 进程(或 MPI 进程的一个 OpenMP 线程)来为每个文件提供服务。该进程将充当“文件服务器”,响应来自其他 MPI 进程的“读取”请求,并通过从文件中读取请求的数据并通过 MPI 将其发送回来为它们提供服务。写的有点长,但是应该可以的。

【讨论】:

  • 感谢漂亮的 cmets。不幸的是,只有最后一个建议对我有用......你有任何好的通过 MPI 实现的消息队列实现吗?
  • 如何在文件上创建 mmap 区域,并在 MPI 中将它们共享为“窗口”以进行单侧通信?
猜你喜欢
  • 1970-01-01
  • 2010-12-04
  • 2012-05-01
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
  • 2018-06-29
相关资源
最近更新 更多