MPI_Bcast报Message truncated错误致程序崩溃的排查咨询
MPI_Bcast 报错 "Message truncated" 的问题修复
核心问题:广播顺序完全颠倒
你的代码存在逻辑错误:先广播数组,再广播数组的长度,这直接导致非0进程无法正确接收数据。
- 非0进程初始化时
size_of_simple = 0,执行第一个MPI_Bcast(simple, size_of_simple, ...)时,这些进程会告知MPI要接收0个long long元素,但root进程(rank0)实际要发送的是筛法生成的真实素数数量size_of_simple个元素。发送与接收的缓冲区大小不匹配,触发"Message truncated"错误。 - 正确逻辑是:必须先让所有进程知晓要接收的元素数量,才能正确接收数组数据。
修复代码
将两个MPI_Bcast的顺序调换即可:
MPI_Barrier(MPI_COMM_WORLD); // 第一步:先广播素数数量,让所有进程明确接收的数据长度 MPI_Bcast(&size_of_simple, 1, MPI_INT, 0, MPI_COMM_WORLD); // 第二步:根据已知长度广播素数数组 MPI_Bcast(simple, size_of_simple, MPI_LONG_LONG, 0, MPI_COMM_WORLD); parallel_algorithm(n, simple, size_of_simple, rank, size);
修改筛法参数后接收字节数变化的原因
sieve_of_Eratosthenes的第一个参数决定了素数生成范围,进而决定返回的size_of_simple(素数个数)。root进程发送的字节数为size_of_simple * sizeof(long long),而错误顺序下非0进程始终按初始值0(或循环残留的错误值)准备接收缓冲区,因此当size_of_simple变化时,发送与预期接收的字节数差值也会改变,错误提示中的接收字节数自然随之变化。
额外注意事项
- 确保
malloc(50000 * sizeof(long long))分配的内存足够容纳筛法生成的所有素数,避免缓冲区溢出。若筛法返回的size_of_simple超过50000,需调整内存分配大小。 - 若循环中
sequential_algorithm会修改size_of_simple的值,需保持先广播长度、再广播数组的顺序。
内容的提问来源于stack exchange,提问作者bluzord
相关产品推荐
相关产品推荐

