【问题标题】:Defining global variables in mpi在 mpi 中定义全局变量
【发布时间】:2013-05-16 08:56:42
【问题描述】:

我在下面写了一个示例代码:

#include <stdio.h> 
#include <mpi.h> 

double x;

int main (int argc, char **argv) { 
   MPI_Init(&argc, &argv); 
   MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
   MPI_Comm_size(MPI_COMM_WORLD, &size); 

   if (rank==0) x=10.1;

   MPI_Barrier(MPI_COMM_WORLD);
   printf("%f\n", x);

   MPI_Finalize(); 
   return 0; 
}

大家可能会注意到,这个程序实际上定义了一个名为 x 的全局变量,并且第零个线程尝试为它分配一些值。当我让这个程序在具有 4 个内核的 SMP(对称多处理)机器上运行时,我得到以下结果:

10.1
0
0
0

更有趣的是,当我更改代码以便每个线程打印变量 x 的地址,即 &x 时,它们都打印相同的东西。

我的问题是,一个 SMP 系统上的多个线程怎么可能共享一个变量地址的相同值,而它们却不共享相同的值?

我的第二个问题是我应该如何更改上面的代码才能得到以下结果?

10.1
10.1
10.1
10.1

【问题讨论】:

  • 该变量可能具有相同的地址和不同的值,因为它不是真正的线程而是进程?
  • @Joachim:我怎样才能知道它们是进程还是线程?
  • 在当前的 MPI 实现中,每个等级都是一个单独的过程。

标签: c++ c mpi


【解决方案1】:

你可以使用广播:

MPI_Bcast(&x,1,MPI_DOUBLE,0,MPI_COMM_WORLD);

这会将进程 0 上的 x 值发送给所有其他进程。

【讨论】:

  • 上述函数调用中的0是发起广播的进程的等级。正如您所说,是您的根进程改变了 x 的值,这就是为什么该参数为 0。请注意,MPI_Bcast 是一个阻塞例程。通信器中的每个进程(在这种情况下为 MPI_COMM_WORLD)都需要调用 MPI_BCast() 才能继续任何函数。
猜你喜欢
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多