如何在MPI中使用单个节点编写

时间:2014-09-24 14:06:17

标签: mpi openmpi

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

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

实际上,我已经找到了一些可能有用的信息,但我无法找到更多信息,如何实际实现这些信息:

1:有一个属于通信器的信息密钥MPI_IO,它告诉哪些排名提供符合标准的IO例程。由于这被列为环境调查,我不知道,我可以在哪里修改它。

2:有一个信息键io_nodes_list,它似乎属于与文件相关的信息对象。遗憾的是,此密钥的可能值未记录,Open MPI似乎无法以任何方式实现它们。实际上,我甚至无法从mpi_file_get_info返回的info-object中获取文件名...

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

是否有一种很好的自动方式将IO限制到某些节点?如果是,我该如何实现呢?

1 个答案:

答案 0 :(得分:3)

您明确询问了OpenMPI,但OpenMPI中有两个MPI-IO实现。旧的主力是ROMIO,MPI-IO实现几乎在每个MPI实现中共享。 OpenMPI也有OMPIO,但我不太了解调整那个。

接下来,如果你想让事情自动发生,你将不得不使用集体i / o。独立的I / O例程无法向其他任何人发送消息 - 它们是独立的,并且无法知道对方是否正在收听。

将这些预备课程排除在外......

您在询问“i / o aggregaton”。在另一个称为“延迟打开”的优化(以及OMPIO称之为Lazy Open)的上下文中有一些信息

https://press3.mcs.anl.gov/romio/2003/08/05/deferred-open/

简而言之,您可以肯定地说“只有这N个进程应该执行I / O”,然后集体I / O库将交换数据并确保发生这种情况。优化是在15年前开发的,仅针对您提出的情况:某些节点与其他节点的连接更好(就像旧的ASCI Red机器上的情况一样),让您了解这种优化的年龄。 ..)

我不知道你在哪里io_nodes_list。您可能希望使用MPI-IO信息键cb_config_listcb_nodes

所以,你有一个集成了master1,master2,master3和compute1,compute2,compute3(或者实际上是什么主机名)的集群。你可以做这样的事情(在c中,对不起。我不熟练使用Fortran):

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)

通过这些提示,MPI_File_write_all将通过master1,master2和master3上的MPI进程聚合所有I / O. ROMIO不会炸毁你的内存,因为它会将I / O分成一个较小的工作集(用“cb_buffer_size”提示:如果你有内存的话,启动它是一种获得更好性能的好方法) 。

有很多关于您可以在ROMIO用户指南中设置的提示的信息: http://www.mcs.anl.gov/research/projects/romio/doc/users-guide/node6.html