我想用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限制到某些节点?如果是,我该如何实现呢?
答案 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_list
和cb_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