【发布时间】:2014-04-16 09:12:24
【问题描述】:
我有一个关于 MPI 的基本问题,以便更好地理解它(我是 MPI 和多个进程的新手,所以请多多包涵)。我正在使用 C++ (RepastHPC) 中的模拟环境,该环境广泛使用 MPI(使用 Boost 库)来允许并行操作。特别是,模拟由各个类(即代理)的多个实例组成,它们应该相互交互、交换信息等。现在考虑到这发生在多个进程上(并且考虑到我对 MPI 的基本理解),我的自然问题或恐惧是,不同进程上的代理不再相互交互,因为它们无法连接(我知道,这与 MPI 的整个想法相矛盾)。
阅读手册后,我的理解是:Boost.MPI 的可用库(以及上述end 包的库)负责进程之间的所有通信和来回发送包,即每个进程都有来自其他进程的实例的副本(我猜这是某种形式的按值调用,b/c 原始实例不能从只有一个副本的进程中更改),然后进行更新,以确保实例与原始实例具有相同的信息,依此类推。
这是否意味着,就模拟运行的最终结果而言,我得到的结果与我将在一个过程中完成整个事情一样?换句话说,多个过程只是为了加快速度而不是改变模拟的设计(因此我不必担心)?
【问题讨论】:
-
对于任何生产并行执行软件的人来说,设计目标是在多个进程上运行时应该产生正确的结果。您进行了哪些测试来了解您所引用的软件是否实现了这一目标?当然,使用串行执行的结果来验证并行执行的结果取决于串行执行本身产生正确结果的保证。
-
感谢您的快速回复。我一开始就误解了我的问题,我目前没有使用该软件,更多的是考虑使用它,所以到目前为止我还没有运行任何测试,但这绝对是一个很好的起点。我毫不怀疑软件的设计者正确地完成了他们的工作,我的问题是该软件的一般目的是否是从并行执行中获得与串行执行相同的结果(即,如果我正确地实现它)。
-
关于测试,这是我能想到的一种方法,以确保它正常工作(如果有更简单的方法,请告诉我): 1. 创建两个代理(ID 1,ID 2)每个拥有两个苹果,创建两个代理(ID 3,ID 4),每个拥有两个橙子。 2.让每个特工遍历特工列表,每当有人有与他们不同的水果时,就给他们。
-
运行一次(或每隔奇数次运行),如果进程之间的通信正常,我应该最终让代理 1 和 2 各有两个橙子,代理 3 和 4 有两个苹果,对吗?
-
另外,有没有一种简单的方法可以在链接程序时将并行进程数设置为1(实际上是关闭MPI部分)?为了查看比较并行和串行执行的结果。我现在尝试了简单的版本,使用 'mpicxx main.cpp' 编译,并使用 'mpirun -n 2 ./main' 运行,但是我似乎无法将数字设置为 1,因为链接似乎没有完成。跨度>