OpenMPI中MPI_Scatter在MPI_COMM_WORLD上报错及阻塞问题排查
问题定位与修复方案
初始MPI_Scatter报错原因
初始MPI_Scatter调用中sendcount参数配置错误:
- 按照MPI官方定义,
sendcount是根进程向单个进程发送的元素个数,而非总发送元素数。需要分发的总元素数为total_process,对应每个进程接收1个元素,因此sendcount应填1。 - 错误填入
total_process时,根进程会尝试向每个进程发送total_process个int元素,总发送量远超缓冲区大小,直接触发MPI_ERR_TRUNCATE消息截断错误。
sendcount修改后程序阻塞原因
MPI集合通信函数要求通信域内所有进程共同调用,仅部分进程调用会触发死锁:
- 原代码将
MPI_Reduce放在if(process_id!=master)条件块内,只有非0进程会执行该调用,0号进程始终未参与集合通信,所有进程陷入互相等待的阻塞状态。 - 修复方式为将
MPI_Reduce移出条件判断块,保证所有进程都执行该调用。
额外隐藏问题
- 野指针访问:声明
int *data后未分配内存就直接对data[i]赋值,属于未定义行为,需要在根进程中先为data分配对应大小的内存:
if (process_id == master) { data = (int*)malloc(sizeof(int) * total_process); for (i = 0; i < total_process; i++){ data[i] = i; } }
data数组无需所有进程初始化,仅根进程维护发送缓冲区即可。- 原
MPI_Reduce的root参数设为1,若需要0号根进程获取最终归约结果,需将该参数改为0,否则0号进程后续的MPI_Recv会因为收不到消息继续阻塞。
内容的提问来源于stack exchange,提问作者Lionel
相关产品推荐
相关产品推荐

