本帖最后由 石子 于 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的问题出在哪一步,为什么明明创建成功了却不能使用呢?请各位指教
|