如何从MPI_BCast接收数据

时间:2011-12-25 22:25:23

标签: mpi parallel-processing

问题是重力交互。系统中有N个粒子和M个过程。 我想在当前进程中的单个块中计算粒子的新位置(总共有11个参数),然后将新数据广播到所有其他进程。 这是我的代码:

double * particles;
...
int startForProcess = numberOfParticlesPerThread * 11 * rank;
int endForProcess = startForProcess + numberOfParticlesPerThread * 11;
calculateNewPosition(particles, startForProcess, endForProcess, nParticles, rank);
MPI_Barrier(MPI_COMM_WORLD);
MPI_Bcast(particles+startForProcess, endForProcess - startForProcess, MPI_DOUBLE, rank, MPI_COMM_WORLD);

不幸的是,在每个线程中,我都可以看到仅在此线程中进行的更改。流程之间没有沟通。

请告诉我,我做错了什么?

1 个答案:

答案 0 :(得分:3)

MPI_Bcast会将数据从根目录广播到通信器中的其他队列。 MPI_Bcast调用中的所有进程必须使用相同的根参数,因为它们都是从同一进程接收数据。

我认为您正在寻找的功能是MPI_Allgather。它将在所有进程中收集和传播更新的数据。

代码看起来像这样:

double * particles;
double * my_particles;
...
int startForProcess = numberOfParticlesPerThread * 11 * rank;
int endForProcess = startForProcess + numberOfParticlesPerThread * 11;
calculateNewPosition(particles, startForProcess, endForProcess, nParticles, rank);

memcpy(my_particles, particles + startForProcess * sizeof(double),
       (endForProcess - startForProcess) * sizeof(double));
MPI_Allgather(my_particles, endForProcess - startForProcess, MPI_DOUBLE,
              particles, endForProcess - startForProcess, MPI_DOUBLE, MPI_COMM_WORLD);

顺便说一下,在集体通话之前你不需要MPI_Barrier,除非你出于其他原因需要同步。