MPI 单面文件 I/O
MPI one-sided file I/O
我对使用 MPI 执行文件 I/Os 有一些疑问。
一组文件分布在不同的进程中。
我希望进程读取其他进程中的文件。
比如在单向通信中,每个进程设置一个window对其他处理器可见。我需要完全相同的功能。 (为所有文件创建 'windows' 并共享它们,以便任何进程都可以从任何偏移量读取任何文件)
在 MPI 中可以吗?我阅读了很多关于 MPI 的文档,但找不到确切的文档。
简单的答案是您不能使用 MPI 自动执行此操作。
您可以通过看到 MPI_File_open()
是一个集体调用来说服自己,该调用将内部通信器作为第一个参数,并将文件处理程序作为最后一个参数返回到打开的文件。在此通信器中,所有进程都打开文件,因此,所有进程都必须看到该文件。因此,除非进程看到文件,否则它无法获得 MPI_file
处理程序来访问它。
现在,这并不意味着没有解决方案。一种可能是完全按照您的描述手动完成,即:
- 每个 MPI 进程单独打开他们看到并负责的文件;然后
- 这些进程中的每一个都将这个本地文件读入缓冲区;
- 这些单独的缓冲区全部公开,使用全局
MPI_Win
内存 windows,或几个单独的缓冲区,为单边读取访问做好准备;最后
- 对以前存储在这些单独本地文件中的任何数据的所有读取访问,现在都通过使用内存 window(s) 的
MPI_Get()
调用完成。
这种方法的真正局限性在于它需要完全读取所有单个文件,因此,每个节点都需要有足够的内存来存储它们中的每一个。我很清楚这是一个非常非常大的警告,可能会使解决方案完全不切实际。但是,如果内存足够,这是一个简单的方法。
另一个更简单的解决方案是将文件存储到共享文件系统中,或者将它们全部复制到所有本地文件系统上。我想这不是一个选择,因为否则不会问这个问题...
最后,在不得已的情况下,我看到的一种可能性是为每个节点指定一个 MPI 进程(或 MPI 进程的一个 OpenMP 线程)来为每个文件提供服务。这个进程将充当 "file server",回答来自其他 MPI 进程的 "read" 请求,并通过从文件中读取请求的数据来为它们提供服务,然后通过 MPI 将其发回。写的有点冗长,但应该可以。
我对使用 MPI 执行文件 I/Os 有一些疑问。
一组文件分布在不同的进程中。 我希望进程读取其他进程中的文件。
比如在单向通信中,每个进程设置一个window对其他处理器可见。我需要完全相同的功能。 (为所有文件创建 'windows' 并共享它们,以便任何进程都可以从任何偏移量读取任何文件)
在 MPI 中可以吗?我阅读了很多关于 MPI 的文档,但找不到确切的文档。
简单的答案是您不能使用 MPI 自动执行此操作。
您可以通过看到 MPI_File_open()
是一个集体调用来说服自己,该调用将内部通信器作为第一个参数,并将文件处理程序作为最后一个参数返回到打开的文件。在此通信器中,所有进程都打开文件,因此,所有进程都必须看到该文件。因此,除非进程看到文件,否则它无法获得 MPI_file
处理程序来访问它。
现在,这并不意味着没有解决方案。一种可能是完全按照您的描述手动完成,即:
- 每个 MPI 进程单独打开他们看到并负责的文件;然后
- 这些进程中的每一个都将这个本地文件读入缓冲区;
- 这些单独的缓冲区全部公开,使用全局
MPI_Win
内存 windows,或几个单独的缓冲区,为单边读取访问做好准备;最后 - 对以前存储在这些单独本地文件中的任何数据的所有读取访问,现在都通过使用内存 window(s) 的
MPI_Get()
调用完成。
这种方法的真正局限性在于它需要完全读取所有单个文件,因此,每个节点都需要有足够的内存来存储它们中的每一个。我很清楚这是一个非常非常大的警告,可能会使解决方案完全不切实际。但是,如果内存足够,这是一个简单的方法。
另一个更简单的解决方案是将文件存储到共享文件系统中,或者将它们全部复制到所有本地文件系统上。我想这不是一个选择,因为否则不会问这个问题...
最后,在不得已的情况下,我看到的一种可能性是为每个节点指定一个 MPI 进程(或 MPI 进程的一个 OpenMP 线程)来为每个文件提供服务。这个进程将充当 "file server",回答来自其他 MPI 进程的 "read" 请求,并通过从文件中读取请求的数据来为它们提供服务,然后通过 MPI 将其发回。写的有点冗长,但应该可以。