问题是重力交互。系统中有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);
不幸的是,在每个线程中,我都可以看到仅在此线程中进行的更改。流程之间没有沟通。
请告诉我,我做错了什么?
答案 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
,除非你出于其他原因需要同步。