我的第一个想法是MPI_Scatter,应该在子句中使用发送缓冲区分配if(proc_id == 0),因为数据应该只分散一次,并且每个进程只需要发送缓冲区中的一部分数据,但是它无法正常工作。
看来发送缓冲区分配MPI_Scatter必须由所有进程执行,然后应用程序才能正常运行。
MPI_Scatter所以我想知道,既然所有进程都可以访问发送缓冲区,那么存在的哲学是什么。
任何帮助将不胜感激。
if (proc_id == 0) {
int * data = (int *)malloc(size*sizeof(int) * proc_size * recv_size);
for (int i = 0; i < proc_size * recv_size; i++) data[i] = i;
ierr = MPI_Scatter(&(data[0]), recv_size, MPI_INT, &recievedata, recv_size, MPI_INT, 0, MPI_COMM_WORLD);
}
Run Code Online (Sandbox Code Playgroud)
我想,根进程分散数据就足够了,其他进程需要做的只是接收数据。因此MPI_Scatter,我将 以及发送缓冲区定义和分配一起放入if(proc_id == 0)语句中。没有编译/运行时错误/警告,但其他进程的接收缓冲区没有收到其相应的数据部分。
mpi ×1