【问题标题】:MPI and global variablesMPI 和全局变量
【发布时间】:2013-12-29 21:50:32
【问题描述】:

我必须实现一个 MPI 程序。有一些全局变量(4 个浮点数数组和其他 6 个单浮点变量)首先由从文件读取数据的主进程初始化。然后我调用 MPI_Init,当 0 级进程等待结果时,其他进程(1、2、3、4 级)在数组等上工作...... 问题是这些数组似乎不再被初始化,全部设置为0。我试图在主函数中移动全局变量,但结果是一样的。当调用 MPI_Init() 时,所有进程都是由 fork 创建的,对吗?所以每个人都有一个父亲的内存副本,为什么他们看到没有初始化的数组?

【问题讨论】:

    标签: mpi


    【解决方案1】:

    恐怕你误会了。

    最好将每个 MPI 进程视为一个独立的程序,尽管它与计算中的每个其他进程具有相同的源代码。进程0对其地址空间中的变量进行的操作对其他进程地址空间的内容没有影响。

    我不确定 MPI 标准是否要求进程 0 具有在调用 mpi_init 之前声明和初始化的变量值,即在进程 0 真正存在之前。

    无论是否这样做,您都必须编写代码将值放入其他进程地址空间中的变量中。一种方法是让进程 0 将值一个接一个或使用广播发送给其他进程。另一种方法是让所有进程从输入文件中读取值;如果您选择此选项,请注意对 i/o 资源的争用。

    顺便说一句,我认为 MPI 实现通过在调用 mpi_init 时分叉来创建进程并不常见,分叉更常用于创建线程。我认为大多数 MPI 实现实际上会在您调用 mpiexec 时创建进程,对 mpi_init 的调用是宣布您的程序开始并行计算的形式。

    【讨论】:

    • 您的回答非常有用。我必须将这个练习作为并行编程课程的一个小项目来实现,老师希望我们使用 mpi(也许它是更好的 openmp)......该程序应该计算平均分布在三个方向上的 100 个球体的总体积x,y,z 并给出它们的光线并使用蒙特卡洛算法(近似值)。所有这些数据在开始时都插入到 4 个不同的数组中,我认为每个进程都应该有它们的副本……好吧,我将使用广播。谢谢你……你对我真的很好。
    • 所以最好的解决方案是进程 0 初始化数组,然后将它们 bcas 给其他人,不是吗?我担心这是浪费并行计算的时间......
    • 并行计算机可能会浪费时间,但在您了解该主题时会很好地利用您的时间。
    【解决方案2】:

    当调用 MPI_Init() 时,所有进程都是由 fork 创建的,对吗?

    错误。

    MPI 生成程序的多个实例。这些实例是独立的进程,每个都有自己的内存空间。每个进程都有自己的每个变量的副本,包括全局变量。 MPI_Init()只初始化MPI环境,以便调用其他MPI函数。

    【讨论】:

    • 所以最好的解决方案是进程 0 初始化数组,然后将它们 bcas 给其他人,不是吗?我担心这是浪费并行计算的时间......
    【解决方案3】:

    正如其他答案所说,这不是 MPI 的工作方式。数据对于每个进程都是唯一的,并且必须使用 MPI 规范中提供的 API 在进程之间显式传输。

    但是,有些编程模型允许这种行为。如果当您说并行计算时,您的意思是一个处理器上有多个内核,那么使用OpenMP 之类的东西在线程之间共享数据可能会更好。

    或者,如果您确实需要使用多个处理器(因为您的数据太大而无法放入一个处理器的内存中,或者其他原因),您可以查看其中一个并行全局地址空间 ( PGAS) 语言。在这些模型中,您拥有对执行中的所有进程全局可用的内存。

    最后,MPI 的一部分确实允许您将内存从一个进程公开给其他进程。这是远程内存访问 (RMA) 或单面章节。如果这是您需要的计算模型,它可能很复杂,但功能强大。

    所有这些模型都需要改变您的应用程序的工作方式,但听起来它们可能会更好地映射到您的问题。

    【讨论】:

    • 在阅读了一些 cmets 之后,我发现这实际上是一个课程的练习,所以改变你的模型不是一种选择,但是为后代提供这个答案仍然是件好事,这是 SE 的点。
    • 请提出另一个问题:所有进程/等级应该在 min 和 max 之间创建不同的随机浮点数(由我给出)但是如果我启动 mpirun -np 5 ./program 所有进程/等级生成同一个随便的号码……怎么能避免呢?
    • 这确实应该作为一个单独的问题提出。无论如何,这并不是 MPI 特有的。
    • 事实上已经在 SO 上进行了询问和回答,例如:stackoverflow.com/questions/8920411/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2022-01-28
    相关资源
    最近更新 更多