如何使用MPI广播发送两个数值时避免出现信号11错误
问题原因与解决方案
- 11号信号是Linux下的段错误,代表进程访问了非法内存地址。从运行日志看3个进程都成功打印出了1024x1024的图片尺寸,说明你贴出的广播宽高的代码本身是正常执行的,错误出现在这段代码之后的逻辑中。
- 最高概率的出错点:你在后续代码中没有判断进程rank,直接访问了
pixels_in指针。这个指针仅在0号进程中被stbi_load赋值为合法的堆内存地址,其余非0号进程的pixels_in是未初始化的野指针,一旦读写就会触发段错误。 - 其他排查方向:
- 如果后续需要广播整个图片的像素数据,需要先在所有非0号进程中,根据广播拿到的宽高计算内存大小,给
pixels_in分配对应大小的内存后,再调用MPI广播像素数据,禁止直接使用未分配内存的野指针。 - 检查后续逻辑中所有数组访问、指针操作是否有越界、未初始化的情况。
- 如果后续需要广播整个图片的像素数据,需要先在所有非0号进程中,根据广播拿到的宽高计算内存大小,给
临时验证方法:你可以在printf语句之后直接添加
MPI_Finalize(); return 0;运行测试,如果没有报错,即可确认问题完全出在你未贴出的后续代码中。
内容的提问来源于stack exchange,提问作者Adrià Torija
相关产品推荐
相关产品推荐

