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
相关产品推荐
相关产品推荐

