我在下面写了一个示例代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
正如人们可能注意到的,这个程序实际上定义了一个名为x的全局变量,而第0个线程试图为它分配一些值.当我在具有4个内核的SMP(对称多处理)机器上运行该程序时,我得到以下结果:
10.1
0
0
0
Run Code Online (Sandbox Code Playgroud)
更有趣的是,当我更改我的代码以便每个线程打印变量x的地址,即&x时,它们都打印相同的东西.
我的问题是,如果SMP系统上的一些线程共享一个变量地址的相同值,而它们不共享相同的值,那么该怎么可能?
我的第二个问题是我应该如何更改上面的代码,以便得到以下结果?
10.1
10.1
10.1
10.1
Run Code Online (Sandbox Code Playgroud)
你可以使用广播:
MPI_Bcast(&x,1,MPI_DOUBLE,0,MPI_COMM_WORLD);
Run Code Online (Sandbox Code Playgroud)
这会将进程0上的x值发送给所有其他进程.