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