【问题标题】:MPI Memory AllocationMPI 内存分配
【发布时间】:2012-02-01 05:12:07
【问题描述】:

使用 MPI 在 C/C++ 中编写代码时,如果在调用 MPI_Init 之前分配了内存,每个进程如何查看该内存?从测试程序中,我可以看到有时可以,而有时则不行。标准是否定义了这一点?我不知道在 MPI_Init 期间内存分配是否被复制到其他进程,或者我是否幸运,因为所有进程“当前”都在单个(多核)CPU 上。

【问题讨论】:

  • 在 MPI_Init 应该没有复制。在调用MPI_Init之前,每个进程分配的内存都是一样的,所以大家应该都能看到吧?
  • 我想这是我不明白的——在 MPI_Init 之前,其他进程是否存在?如果不是,那么在 MPI_Init 之前分配内存只会将内存分配给“主”(id=0)进程?
  • 是的。您可以通过编写一个不调用 MPI_Init 的 hello world 程序来测试这一点,并并行执行它——您将生成 n 个独立进程,每个进程都会说“hello”。调用 MPI_Init 建立环境 (MPI_Comm),该环境在进程之间创建链接并允许它们说出自己的身份(例如,我的 id 是什么?)。
  • 请注意,在某些 MPI 实现中,在 MPI_Init 之前只存在一个进程。在 MPI_Init 期间,这些实现将实际生成 MPI 作业中的其他进程。所以真正可移植的 MPI 程序在 MPI_Init 之前不会做任何事情,或者至少会对 MPI_Init 之前/期间/之后发生的事情做出非常小的假设。
  • 这就是我所害怕的——是否有一些明确的参考可以确定是否/如何定义?你知道 MPI 标准是否提到了这一点吗?我已经在 Windows Server 2008 R2 HPC 版上测试了 MPICH2 和 msmpi,并且这些进程在加载 exe 时会产生。我猜如果其他 MPI 实现不以这种方式执行,那么这种行为是未定义的?

标签: c++ c parallel-processing mpi


【解决方案1】:

是的。每个进程都是在可执行加载时生成的。如果在调用 MPI_Init 之前分配了任何内存,则每个进程都知道该数据。但是,在调用 MPI_Init 之前,进程并不知道自己或彼此。调用 MPI_Init 和 MPI_Comm_world 初始化 MPI 环境并返回 MPI_Comm,它允许您在进程之间建立连接。

【讨论】:

    【解决方案2】:

    感谢 IRO 机器人!我编写了 HelloWorld.cpp 并对其进行了测试;这是给其他感兴趣的人的副本。

    #include <iostream>
    #include "mpi.h"
    
    int main(int argc, char* argv[])
    {
        int numprocs;
        int myid = 0;
        std::cout << "Hello MPI World, from process " << myid << "!! " << std::endl;
    
        MPI_Init(&argc, &argv);
        MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
        MPI_Comm_rank(MPI_COMM_WORLD, &myid);
    
        if(myid == 0)
            std::cout << std::endl;
    
        std::cout << "Hello MPI World, from process " << myid << "!! " << std::endl;
    
        MPI_Finalize();
        return 0;
    }
    

    示例输出来自:mpiexec -n 4 HelloMPIWorld

    你好 MPI World,来自进程 0! 你好 MPI World,来自进程 0! 你好 MPI World,来自进程 0! 你好 MPI World,来自进程 0!

    你好 MPI World,来自进程 0! 你好 MPI World,来自过程 3! 您好 MPI World,来自流程 1! 你好 MPI World,来自进程 2!

    【讨论】:

      猜你喜欢
      • 2015-06-09
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 2019-04-27
      • 2018-09-26
      • 2018-10-27
      • 2018-08-28
      • 1970-01-01
      相关资源
      最近更新 更多