MPI Fundamentals
MPI Fundamentals
我有一个关于MPI的基本问题,为了更好地理解它(我是MPI和多个进程的新手,所以请在这个问题上容忍我)。我正在使用c++ (RepastHPC)中的模拟环境,该环境广泛使用MPI(使用Boost库)来允许并行操作。特别是,模拟由各自类(即代理)的多个实例组成,它们应该相互交互,交换信息等。现在考虑到这发生在多个进程上(并且考虑到我对MPI的基本理解),我的自然问题或恐惧是,不同进程上的代理不再相互作用,因为它们无法连接(我知道,这与MPI的整个思想相矛盾)。
阅读手册后,我的理解是:Boost的可用库。MPI(也是乡镇以上mentionend包)照顾所有的进程间通信和来回发送包,即每个流程实例的副本从其他进程(我想这是某种形式的调用的值,b/c的原始实例不能被改变的过程,只有一个副本),然后一个更新,以确保副本实例具有与原件相同的信息等等。
这是否意味着,就模拟运行的最终结果而言,我得到的结果与我在一个进程上完成整个过程的结果相同?换句话说,多个过程只是为了加快速度,而不是改变模拟的设计(因此我不必担心它)?
我认为你对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()
,但还有很多很多。你需要找一个教程
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- MPI突然停止了对多个核心的操作
- 设置 Visual Studio for MPI: 找不到标识符错误
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- 重载 MPI 中的运算符 ()
- MPI:检查是否有任何进程已终止
- 使用 pybind11 共享 MPI 通信器
- 使用 CMake,Microsoft MPI 和 Visual Studio 2017 找不到 mpi.h
- 在具有 MPI 的超立方体中广播
- 通过 mpi 发送 c++ 标准::矢量<bool>
- 使用 MPI 的 C++ 中的并行 for 循环
- 如何将 OpenMP 和 MPI 导入到大型 CLion CMake 项目中?
- 如何通过Boost.MPI发送2d Boost.MultiArray的子阵列?
- HDF5 构建了并行支持,但找不到特定于 mpi 的功能
- MPI 集合通信中的指针分配
- 仅特定内核计数上的 MPI 内存损坏
- 如何在 Mac OS 上安装 boost-mpi 及其对 clang 的依赖关系?
- 从Visual Studio 2017运行MPI应用程序,每个进程在不同的cmd窗口中
- MPI Fundamentals