MPI基础知识

Tar*_*lia 0 c++ boost mpi

我有一个关于MPI的基本问题,为了更好地理解它(我是MPI和多个过程的新手,所以请在这个上承担我的责任).我正在使用C++(RepastHPC)中的模拟环境,它广泛使用MPI(使用Boost库)来允许并行操作.特别是,模拟由各个类(即代理)的多个实例组成,它们应该相互交互,交换信息等.现在假设这发生在多个进程上(并且给出了我对MPI的基本理解)我所拥有的自然问题或恐惧是,不同进程的代理不再相互影响,因为它们无法连接(我知道,这与MPI的整个概念相矛盾).

阅读本手册后,我的理解是这样的:Boost.MPI的可用库(以及上面提到的包的库)负责处理所有通信并在进程之间来回发送包,即每个进程都有来自其他进程的实例(我猜这是某种形式的值调用,b/c原始实例不能从只有副本的进程中更改),然后进行更新,以确保实例的副本具有与原件相同的信息等.

这是否意味着,就模拟运行的最终结果而言,我会像在一个进程中完成整个事情一样?换句话说,多个过程只是为了加快速度而不是改变模拟的设计(因此我不必担心它)?

Wes*_*and 5

我认为你对MPI有一个根本的误解.MPI不是自动并行化库.它不是分布式共享内存机制.它对你没有任何魔力.

它所做的是使相同或不同机器上的不同进程之间的通信更简单.每个进程都有自己的地址空间,与其他进程不重叠(除非你在MPI之外做其他事情).假设您正确设置了MPI安装,它将为您在进程之间建立通信通道带来所有痛苦.它还为您提供了一些更高级别的抽象,如集体沟通.

使用MPI时,编译代码的方式与正常情况不同.g++ -o code code.cpp您可以使用而不是使用(或任何编译器)mpicxx -o code code.cpp.这将自动链接所有必要的MPI内容.然后,当您运行应用程序时,使用mpiexec -n <num_processes> ./code(其他参数不是必需的,但可能是必需的).该论点num_processes将告诉MPI要启动多少个进程.这不是在编译/链接时完成的.

您还必须重写代码才能使用MPI.MPI有很多功能(这里有标准,网上有很多可以更容易理解的教程),你可以使用它们.基础是MPI_Send()和MPI_Recv(),但有很多很多.你必须找到一个教程.