You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MPI Send/Recv传输结构体是否需提前做格式转换

问题结论

你不需要为发送struct grid做额外的结构体转换,但你当前写的代码存在多处致命错误,直接运行会崩溃或者收错数据,必须修正。

现有代码的错误点
  • 发送长度参数错误:你写的sizeof(ptr)计算的是指针变量本身的长度(64位系统下固定为8字节),根本不是要发送的grid结构体的实际大小,正确参数应该填sizeof(struct grid)。
  • 链表遍历逻辑错误:循环内每次执行ptr = gridList->next只会固定取头节点的下一个节点,不会顺着链表向后遍历,会导致重复发送、甚至访问野指针,正确写法是ptr = ptr->next。
  • 不需要发送完整的grids链表节点:节点里的next成员是0号进程自身内存空间的虚拟地址,发到其他进程没有任何意义,其他进程拿到这个地址也无法访问对应内存,你当前只需要发送grid成员的设计是对的,刚好匹配接收后传入callMethod()的需求。
补充说明

如果你后续需要发送包含start成员的完整有效数据(不需要带无效的next指针),才需要自定义MPI派生数据类型,参考实现如下:

MPI_Datatype MPI_GridsType;
// 两个成员:grid是N*N个int,start是1个int
int blocklens[2] = {N*N, 1};
MPI_Aint offsets[2] = {offsetof(grids, grid), offsetof(grids, start)};
MPI_Datatype types[2] = {MPI_INT, MPI_INT};
MPI_Type_create_struct(2, blocklens, offsets, types, &MPI_GridsType);
MPI_Type_commit(&MPI_GridsType);

针对你当前只发送struct grid的需求,这个结构体内部是连续存储的定长int二维数组,在同架构、同编译参数运行的MPI进程间内存布局完全一致,直接按连续字节收发即可,不需要额外做序列化或者格式转换。

注意:所有进程代码中定义struct grid时用到的宏N必须完全一致,否则会出现数据解析错位。

内容的提问来源于stack exchange,提问作者user10823919

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 20:31:03