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

C++ C/C++;分布式计算框架(MPI?),c++,c,mpi,distributed-computing,C++,C,Mpi,Distributed Computing,我正在调查是否有一个框架/库可以帮助我实现分布式计算系统 我有一个主机,它将大量数据拆分成几百兆字节的文件。这些文件将被分成约1MB的块,并分发给工人进行处理。初始化后,每个工作进程上的处理依赖于从上一个块中获得的状态信息,因此工作进程必须在整个过程中保持活动状态,并且主进程需要能够将正确的块发送给正确的工作进程。另一件需要注意的事情是,这个系统只是一个更大的处理链的一部分 我对MPI(特别是开放式MPI)做了一些研究,但我不确定它是否合适。它似乎适合发送小消息(几个字节),尽管我确实发现一些图

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

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

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

我担心可能没有办法维持状态,除非它不断地在消息中来回发送。查看一些MPI示例的结构,看起来master(级别0)和worker(级别1-n)是同一块的一部分,它们的操作由条件决定。我可以让工作人员保持活动状态(保持状态)并等待更多消息到达吗

现在我在写这篇文章,我想它会有用的。秩1…n部分只是一个循环,后面是处理代码,后面是阻塞接收。该状态将保持在该循环中,直到收到“不再有数据”消息,此时它将返回结果。我可能已经开始掌握MPI结构了

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


所以我的问题是MPI是这里的正确框架吗?是否有更适合此任务的方法,或者我将从头开始执行此操作?

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

如果您想为应用程序提供状态,可以使用一个持续运行的MPI应用程序和主进程,随时间向工作进程发送命令。您可能还应该考虑将该状态保存到磁盘,以便对故障提供更多的鲁棒性。 MPI进程的运行最初由
mpirun
完成。例如,您创建一些程序
program.c
,然后使用
mpicc-o program.c
编译它。然后必须运行
mpirun-np20./program
才能运行20个进程。您将有20个独立的进程,每个进程都有自己的等级,因此进一步的进展取决于您的应用程序。这20个进程在节点/处理器之间的分布方式由hostfile等控制,应该更仔细地查看文档

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


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

请查看。他们使用数据流模型来处理数据。如果此模型适合您,它将非常高效。

如果您正在使用集群和mpi启动并运行,那么我建议您看看boost mpi。它是一个C++封装器,它位于底层MPI库(如OpenMPI或MPICH2)上。我发现它很有用

您的想法是来回发送消息,每个节点在消息完成后请求一条新消息,直到握手说“不再发送消息”为止,这听起来不错。我有一个类似的想法,并得到了一个简单的版本,并开始运行。我只是帮你把它放在github上,以防你想看看。大部分代码都在头文件中:


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

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

RayPlatform根据LGPLv3获得许可。 链接:

它也有很好的记录

使用RayPlatform的示例应用程序:

编辑:添加链接