|
本帖最后由 石子 于 2024-6-1 13:28 编辑
我需要发送一个派生数据类型的变量,通过MPI_Type_Create_Struct()创建了相应的MPI结构体数据类型,输出的ierr=0说明创建成功了。但在MPI_Isend时报错:无效的MPI datatype,不知道是什么原因,向各位请教。具体细节如下:
派生变量定义:[Fortran] 纯文本查看 复制代码 2 | double precision :: r 1 , r 2 , i 1 , i 2 |
[Fortran] 纯文本查看 复制代码 1 | type ( efield ) , dimension ( : , : ) , allocatable :: e , e 01 , e 02 , e 03 , e 04 |
MPI_EFIELD数据类型创建:
[Fortran] 纯文本查看 复制代码 1 | call MPI_Type_Create_Struct ( 4 , ( / 1 , 1 , 1 , 1 / ) , ( / sizeof ( e % r 1 ) , sizeof ( e % r 2 ) , sizeof ( e % i 1 ) , sizeof ( e % i 2 ) / ) , array_of_types , MPI_EFIELD , ierr ) |
2 | if ( rank == 0 ) print * , 'MPI efield create' , ierr |
[Fortran] 纯文本查看 复制代码 1 | integer , dimension ( 1 : 4 ) :: array_of_types = MPI_DOUBLE_PRECISION |
MPI_Isend函数使用:[Fortran] 纯文本查看 复制代码 1 | call MPI_Isend ( e 01 ( pml_cell , 2 : ypml_cell ) , ypml_cell -1 , MPI_EFIELD , pairx 2 , 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] 纯文本查看 复制代码 1 | call MPI_Isend ( e 01 ( pml_cell , 2 : ypml_cell ) % r 1 , ypml_cell -1 , MPI_DOUBLE_PRECISION , pairx 2 , 0 , MPI_COMM_WORLD , request , ierr ) |
不知道创建MPI TYPE的问题出在哪一步,为什么明明创建成功了却不能使用呢?请各位指教
|
|