Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MPI单边文件I/O_Mpi - Fatal编程技术网

MPI单边文件I/O

MPI单边文件I/O,mpi,Mpi,关于使用MPI执行文件I/O,我有一些问题 一组文件分布在不同的进程中。 我希望进程读取其他进程中的文件 例如,在单边通信中,每个进程设置一个对其他处理器可见的窗口。我需要完全相同的功能。(为所有文件创建“窗口”并共享它们,以便任何进程都可以从任何偏移量读取任何文件) 在MPI中可能吗?我读了很多关于MPI的文档,但找不到确切的文档。简单的答案是,你不能用MPI自动完成这项工作 您可以通过看到MPI\u File\u open()是一个集体调用,将内部通信器作为第一个参数,并将文件处理程序返回到

关于使用MPI执行文件I/O,我有一些问题

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

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


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

简单的答案是,你不能用MPI自动完成这项工作

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

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

  • 每个MPI进程单独打开它们看到并负责的文件;然后
  • 每一个进程都将这个本地文件读入一个缓冲区
  • 这些单独的缓冲区都是公开的,使用一个全局
    MPI_-Win
    内存窗口或几个单独的内存窗口,准备进行单边读取访问;最后
  • 对以前存储在这些单独本地文件中的任何数据的所有读取访问现在都通过使用内存窗口的
    MPI_Get()
    调用完成
  • 这种方法的真正限制是需要完全读取所有单独的文件,因此,每个节点需要有足够的内存来存储每个文件。我很清楚,这是一个非常非常非常大的警告,可能会使解决方案完全不切实际。然而,如果内存足够,这是一种简单的方法

    另一个更简单的解决方案是将文件存储到共享文件系统中,或者将它们全部复制到所有本地文件系统中。我想这不是一个选项,因为如果不是这样的话,这个问题就不会被问到了


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

    你说的“一组文件分布在不同的进程中”是什么意思?这是否意味着这些文件位于本地文件系统上,仅对给定的MPI进程装入/可见,而对另一个MPI进程不可见?(就像在不同计算节点的
    /tmp
    上一样)@Gilles是的,这意味着这些文件位于本地文件系统上,仅在给定的MPI进程中装入/可见,而不在其他进程中。感谢您的宝贵意见。不幸的是,只有最后的建议对我有效。。。您是否有任何通过MPI实现的消息队列的良好实现?如何在文件上创建mmap区域,并在MPI中将其作为“窗口”共享以进行单边通信?