MPI_Allgather使用问题求助:多进程数据聚合结果异常
MPI_Allgather 使用错误修正
你的问题出在对MPI_Allgather参数的理解偏差:
MPI_Allgather的第四个参数recvcount,指的是单个进程发送过来的元素数量,而非所有进程发送的总元素数。- 你写的
k*(nProc-1)会让MPI误以为每个进程要给你发这么多元素,但实际上每个进程只发k个int,导致缓冲区只被填充了部分数据,所以最终只看到自身和进程0的元素。
正确的调用方式应该把recvcount设为k——因为每个进程都发送k个int,所以每个进程从每个源进程接收k个int,最终所有进程的数据会被拼接成总长度为k*nProc的数组(如果你的场景中进程数nProc等于k,那就是你要的k*k长度)。
修正后的代码:
int c[k]; int mtemp[k * nProc]; // 缓冲区大小要足够容纳所有进程的k个元素 MPI_Allgather(&c[0], k, MPI_INT, &mtemp[0], k, MPI_INT, MPI_COMM_WORLD);
执行后,mtemp会按进程编号顺序存储所有进程的c数组:比如进程0的元素在mtemp[0..k-1],进程1的在mtemp[k..2k-1],以此类推,每个进程都能拿到所有进程的向量数据。
内容的提问来源于stack exchange,提问作者AlessandroIV
相关产品推荐
相关产品推荐

