【发布时间】: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