Fortran Coder

查看: 195|回复: 1

[并行] MPI发送派生数据类型问题

[复制链接]

35

帖子

16

主题

0

精华

专家

F 币
399 元
贡献
396 点
发表于 2024-5-31 21:35:24 | 显示全部楼层 |阅读模式
本帖最后由 石子 于 2024-6-1 13:28 编辑

我需要发送一个派生数据类型的变量,通过MPI_Type_Create_Struct()创建了相应的MPI结构体数据类型,输出的ierr=0说明创建成功了。但在MPI_Isend时报错:无效的MPI datatype,不知道是什么原因,向各位请教。具体细节如下:
派生变量定义:
[Fortran] 纯文本查看 复制代码
type efield
    double precision::r1,r2,i1,i2
    end type

[Fortran] 纯文本查看 复制代码
type(efield),dimension(:,:),allocatable::e,e01,e02,e03,e04

MPI_EFIELD数据类型创建:
[Fortran] 纯文本查看 复制代码
call MPI_Type_Create_Struct(4,(/1,1,1,1/),(/sizeof(e%r1),sizeof(e%r2),sizeof(e%i1),sizeof(e%i2)/),array_of_types,MPI_EFIELD,ierr)
     if(rank==0) print*,'MPI efield create',ierr
[Fortran] 纯文本查看 复制代码
integer,dimension(1:4):: array_of_types=MPI_DOUBLE_PRECISION

MPI_Isend函数使用:
[Fortran] 纯文本查看 复制代码
call MPI_Isend(e01(pml_cell,2:ypml_cell),ypml_cell-1,MPI_EFIELD,pairx2,0,MPI_COMM_WORLD,request,ierr)

gdb调试时,rank 0可以正常输出MPI_EFIELD创建成功的信息,ierr=0.
但运行至Isend时,报错:
[bellpc:849539] *** An error occurred in MPI_Isend
[bellpc:849539] *** reported by process [1712324609,0]
[bellpc:849539] *** on communicator MPI_COMM_WORLD
[bellpc:849539] *** MPI_ERR_TYPE: invalid datatype
[bellpc:849539] *** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort,
[bellpc:849539] ***    and potentially your MPI job)
然后我修改了MPI_Isend参数,发送双精度数组时发现该行代码可以正常运行,说明是MPI datatype无效的问题。修改如下:
[Fortran] 纯文本查看 复制代码
call MPI_Isend(e01(pml_cell,2:ypml_cell)%r1,ypml_cell-1,MPI_DOUBLE_PRECISION,pairx2,0,MPI_COMM_WORLD,request,ierr)

不知道创建MPI TYPE的问题出在哪一步,为什么明明创建成功了却不能使用呢?请各位指教



欢迎交流

819

帖子

2

主题

0

精华

大宗师

F 币
3862 元
贡献
2301 点
发表于 2024-6-3 09:53:17 | 显示全部楼层

回帖奖励 +3

找个教程看看,创建后得提交,才能用。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-6-25 00:57

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表