C/ c++框架的分布式计算(MPI?)

C/C++ framework for distributed computing (MPI?)

本文关键字:MPI 分布式计算 c++ 框架      更新时间:2023-10-16

我正在调查是否有一个框架/库可以帮助我实现一个分布式计算系统。

我有一个主机,它有大量的数据分割成几百兆字节的文件。这些文件将被分成大约1MB的块,并分发给工作人员进行处理。初始化后,每个worker上的处理依赖于从前一个块获得的状态信息,因此worker必须在整个过程中保持活动状态,并且主服务器需要能够将正确的块发送给正确的worker。另一件需要注意的事情是,这个系统只是一个更大的处理链的一部分。

我对MPI(特别是Open MPI)做了一点研究,但我不确定它是否合适。它似乎适合于发送小消息(几个字节),尽管我确实找到了一些图表,显示它的吞吐量随着更大的文件(高达1/5 MB)而增加。

我担心可能没有一种方法来维护状态,除非它在消息中不断地来回发送。看看一些MPI示例的结构,看起来主人(排名0)和工人(排名1-n)是同一块的一部分,他们的行动是由条件决定的。我可以让工作线程保持活动状态(维持状态)并等待更多消息到达吗?

现在我在写这篇文章,我想这是可行的。排名第一的……第N段将只是一个带有阻塞接收和处理代码的循环。该状态将在该循环中保持,直到收到"没有更多数据"消息,此时它将发送回结果。我可能开始掌握MPI结构了…

我关于MPI的另一个问题是如何实际运行代码。请记住,这个系统是更大系统的一部分,因此需要从其他代码调用它。我看到的示例使用了mpirun,您可以使用它指定处理器的数量或主机文件。我可以通过从其他代码调用我的MPI函数获得相同的行为吗?

我的问题是MPI是正确的框架吗?有没有更适合这个任务的东西,还是我要从头开始?

MPI似乎是您任务的合理选择。它使用SPMD体系结构,这意味着您可以在可能的分布式甚至异构系统上同时执行相同的程序。因此,0级进程为主进程,其他进程为工人进程的选择不是强制性的,您可以选择其他模式。

如果你想为你的应用程序提供状态,你可以使用一个持续活动的MPI应用程序和主进程,随着时间的推移向工作进程发送命令。您可能还应该考虑将该状态保存到磁盘,以便为故障提供更强的健壮性。

MPI进程的运行最初是由mpirun完成的。例如,您创建了一些程序program.c,然后使用mpicc -o program program.c对其进行编译。然后你必须运行mpirun -np 20 ./program <params>来运行20个进程。您将有20个独立的进程,每个进程都有自己的排名,因此进一步的进展取决于您的申请。这20个进程在节点/处理器之间分布的方式是由hostfile等控制的,应该仔细查看文档。

如果你希望你的代码是可重用的,即可从另一个MPI程序运行,你通常应该至少学习什么是MPI通信器,以及如何创建/使用一个。网上有文章,关键词是"创建MPI库"。

如果使用你的库的代码不是在MPI本身,这不是一个大问题,你的程序在MPI并不局限于MPI通信。它应该通过MPI在它的逻辑内部进行通信。您可以使用mpirun调用任何程序,除非它尝试调用MPI库,否则它不会注意到它正在MPI下运行。

如果您正在启动并运行集群和mpi,那么我建议您查看boost mpi。它是底层mpi库(如openmpi或mpich2)上的c++包装器。我发现它很有用。

你的来回发送消息的想法,每个节点在完成后请求一条新消息,直到握手表示"不再提供消息"听起来很好。我有一个类似的想法,并有一个简单的版本,并运行。我只是把它放在github上,如果你想看的话。https://github.com/thshorrock/mpi_manager。大部分代码都在头文件中:https://github.com/thshorrock/mpi_manager/blob/master/include/mpi_manager/mpi_manager.hpp

注意,这只是一小段用来让我启动和运行的代码,它没有完整的文档,也不是最终版本,但它相当短,对我的目的很好,应该为你提供一个起点。

看看FastFlow。他们使用数据流模型来处理数据。如果这种型号适合你,效率是极高的。

RayPlatform是c++的MPI框架。您需要为您的应用程序定义插件(如Linux中的模块)。

RayPlatform在LGPLv3下获得许可。链接:https://github.com/sebhtml/RayPlatform

它也有很好的文档。

使用RayPlatform的示例应用程序:https://github.com/sebhtml/RayPlatform-example

edit: add link