如何在MPI中使用单个节点进行写入

如何在MPI中使用单个节点进行写入,mpi,openmpi,Mpi,Openmpi,我想用MPI(特别是OpenMPI)提供的例程实现一些文件io 由于环境的可能限制,我想知道是否有可能限制负责IO的节点,以便所有其他节点都需要对这组进程执行隐藏的mpi\u发送,以实际写入数据。如果主节点位于具有高性能文件系统的节点上,而其他节点只能访问存储二进制文件的低性能文件系统,那么这种情况就很好了 事实上,我已经找到了一些可能有用的信息,但我找不到进一步的信息,即如何实际实现这些东西: 1:有一个属于通信器的信息键MPI\u IO,它告诉哪些列组提供符合标准的IO例程。由于这被列为环境

我想用MPI(特别是OpenMPI)提供的例程实现一些文件io

由于环境的可能限制,我想知道是否有可能限制负责IO的节点,以便所有其他节点都需要对这组进程执行隐藏的
mpi\u发送
,以实际写入数据。如果主节点位于具有高性能文件系统的节点上,而其他节点只能访问存储二进制文件的低性能文件系统,那么这种情况就很好了

事实上,我已经找到了一些可能有用的信息,但我找不到进一步的信息,即如何实际实现这些东西:

1:有一个属于通信器的信息键
MPI\u IO
,它告诉哪些列组提供符合标准的IO例程。由于这被列为环境调查,我看不出,我可以在哪里修改它

2:有一个信息键
io\u节点\u列表
,它似乎属于与文件相关的信息对象。不幸的是,此键的可能值没有文档记录,而且
openmpi
似乎没有以任何方式实现它们。实际上,我甚至无法从
mpi\u file\u get\u info
返回的info对象中获取文件名

作为一种解决方法,我可以想象两件事:一方面,我可以使用标准Fortran例程执行IO,另一方面,创建一个负责IO的新通信器。但在这两种情况下,负责IO的进程必须检查来自其他进程的可能IO,以执行手动通信和文件交互


有没有一种好的、自动的方法将IO限制在某些节点上?如果是,我如何实现这一点?

您明确询问了OpenMPI,但OpenMPI中有两种MPI-IO实现。旧的工作是ROMIO,它是几乎每个MPI实现之间共享的MPI-IO实现。OpenMPI也有OMPIO,但我不太了解如何调整它

接下来,如果您想让事情自动发生,就必须使用集体i/o。独立的I/O例程不能向其他任何人发送消息——它们是独立的,无法知道对方是否会监听

那些预赛已经结束了

您正在询问“i/o聚合”。在另一个名为“延迟打开”(OMPIO称之为延迟打开)的优化上下文中,这里有一些信息

简而言之,您可以明确地说“只有这N个进程应该做I/O”,然后集体I/O库将交换数据并确保这一点。该优化是在大约15年前针对您提出的情况开发的:一些节点比其他节点更好地连接到存储(就像旧的ASCI Red机器上的情况一样,让您了解此优化有多老……)

我不知道你从哪里得到了
io\u节点\u列表
。您可能希望使用MPI-IO信息键
cb\U配置\U列表
cb\U节点

因此,您得到了一个包含master1、master2、master3和compute1、compute2、compute3(或其他主机名)的集群。您可以这样做(在c语言中,对不起,我不精通Fortran):

有了这些提示,MPI_File_write_all将通过master1、master2和master3上的MPI进程聚合所有I/O。ROMIO不会破坏您的内存,因为它会将I/O分块到一个较小的工作集(使用“cb_buffer_size”提示指定:如果您有内存,启动它是获得更好性能的一个好方法)

您可以在ROMIO用户指南中设置大量有关提示的信息:

感谢您提供了这一信息丰富的答案。我从
MPI-3
标准中获得了
io\u节点列表
,我对
C
语言没有问题。尽管如此,我还是希望有一种非集体的可能性,让事情保持不同步。哈!我对我们的MPI-IO实现进行了近13年的黑客攻击,但我从来不知道IO节点列表。但在第13.2节“保留文件提示”下,它就在这里。ROMIO也不支持“filename”提示…尽管这很容易实现。对于非集体方法,您必须在MPI-IO之上实现一些东西。比如说,某种分布式缓存(西北大学在2008年的时间框架内在这方面做了大量工作)。你可以想象连接良好的节点上的RMA窗口,劫持MPI_Write使其实际成为MPI_Put。。。“细节留给读者”。。。它们是毛茸茸的细节…OpenMPI1.8中的OMPIO似乎无法通过info参数以任何方式控制。信息只是简单地存储起来,以便以后可以使用
MPI\u FILE\u GET\u info
检索。请注意
MPI\u IO
属于执行环境的预定义属性,因此是只读的。它的存在主要是出于历史和便携性的原因。在现代集群系统上,它的价值总是
MPI\u ANY\u SOURCE
,因为所有CPU都以某种方式连接到I/O子系统。
MPI_Info info;
MPI_File fh;
MPI_Info_create(&info);
MPI_Info_set(info, "cb_config_list", "master1:1,master2:1,master3:1");
MPI_File_open(MPI_COMM_WORLD, filename, MPI_MODE_CREATE|MPI_MODE_WRONLY, info, &fh)