石子 发表于 2024-5-31 21:35:24

MPI发送派生数据类型问题

本帖最后由 石子 于 2024-6-1 13:28 编辑

我需要发送一个派生数据类型的变量,通过MPI_Type_Create_Struct()创建了相应的MPI结构体数据类型,输出的ierr=0说明创建成功了。但在MPI_Isend时报错:无效的MPI datatype,不知道是什么原因,向各位请教。具体细节如下:
派生变量定义:type efield
    double precision::r1,r2,i1,i2
    end type
type(efield),dimension(:,:),allocatable::e,e01,e02,e03,e04
MPI_EFIELD数据类型创建:
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',ierrinteger,dimension(1:4):: array_of_types=MPI_DOUBLE_PRECISION
MPI_Isend函数使用: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时,报错:
*** An error occurred in MPI_Isend
*** reported by process
*** on communicator MPI_COMM_WORLD
*** MPI_ERR_TYPE: invalid datatype
*** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort,
***    and potentially your MPI job)
然后我修改了MPI_Isend参数,发送双精度数组时发现该行代码可以正常运行,说明是MPI datatype无效的问题。修改如下:
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的问题出在哪一步,为什么明明创建成功了却不能使用呢?请各位指教



li913 发表于 2024-6-3 09:53:17

找个教程看看,创建后得提交,才能用。
页: [1]
查看完整版本: MPI发送派生数据类型问题