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

时间:2011-07-25 11:43:32

标签: c++ c mpi distributed-computing

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

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

我做了一些调查MPI(特别是Open MPI),但我不确定它是否合适。它似乎适合发送小消息(几个字节),但我确实发现一些图表显示它的吞吐量随着文件的增加而增加(最多1/5 MB)。

我担心除非经常在消息中来回传递,否则可能无法维持状态。看一些MPI例子的结构,它看起来像主人(等级0)和工人(等级1-n)是同一部分的一部分,他们的行动是由条件决定的。我可以让工人保持活力(维持状态)并等待更多消息到达吗?

既然我正在写这篇文章,我认为它会起作用。等级1 ... n部分只是一个带有阻塞接收的循环,后跟处理代码。状态将保持在该循环中,直到收到“不再数据”消息,此时它将发回结果。我可能会开始掌握MPI结构......

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

所以我的问题是MPI在这里是正确的框架吗?是否有更适合这项任务的事情,或者我是否会从头开始做这件事?

4 个答案:

答案 0 :(得分:2)

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

如果要为应用程序提供状态,可以使用常用的MPI应用程序和主进程随时间向工作程序发送命令。您可能还应该考虑将该状态保存到磁盘,以便为故障提供更强大的功能。

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

如果您希望代码可以重复使用,即可以从另一个MPI程序运行,您通常应该至少了解MPI Communicator是什么以及如何创建/使用它。网上有文章,关键词是“创建MPI库”。

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

答案 1 :(得分:2)

如果你正在使用群集和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

请注意,这只是用于启动和运行的一些代码,它没有完整记录,而不是最终版本,但它相当短,适合我的目的,应该为你提供一个起点

答案 2 :(得分:1)

看看FastFlow。他们使用数据流模型来处理数据。如果这个型号适合你,它是非常有效的。

答案 3 :(得分:-1)

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

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

也有很好的记录。

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

编辑:添加链接