Memory management 带有Fortran和2字节整数的MPI_ALLreduce
我正在尝试进行2字节整数的MPI求和:Memory management 带有Fortran和2字节整数的MPI_ALLreduce,memory-management,fortran,mpi,Memory Management,Fortran,Mpi,我正在尝试进行2字节整数的MPI求和: INTEGER, PARAMETER :: SIK2 = SELECTED_INT_KIND(2) INTEGER(SIK2) :: s_save(dim) 实际上,它是一个最大值为1到48的数组,因此出于内存原因,2个字节就足够了 因此,我尝试了以下方法: CALL MPI_TYPE_CREATE_F90_INTEGER(SIK2, int2type, ierr) CALL MPI_ALLreduce(MPI_IN_PLACE, s_save, nk
INTEGER, PARAMETER :: SIK2 = SELECTED_INT_KIND(2)
INTEGER(SIK2) :: s_save(dim)
实际上,它是一个最大值为1到48的数组,因此出于内存原因,2个字节就足够了
因此,我尝试了以下方法:
CALL MPI_TYPE_CREATE_F90_INTEGER(SIK2, int2type, ierr)
CALL MPI_ALLreduce(MPI_IN_PLACE, s_save, nkpt_in, int2type, MPI_SUM, world_comm, ierr)
这对于Gfortran+openmpi非常有效
但是,在英特尔的情况下,我遇到了一个崩溃:
MPI_Allreduce(1000)......: MPI_Allreduce(sbuf=MPI_IN_PLACE, rbuf=0x55d2160, count=987, dtype=USER<f90_integer>, MPI_SUM, MPI_COMM_WORLD) failed
MPIR_SUM_check_dtype(106): MPI_Op MPI_SUM operation not defined for this datatype
MPI_Allreduce(1000)…:MPI_Allreduce(sbuf=MPI_就地,rbuf=0x55d2160,计数=987,dtype=USER,MPI_总和,MPI_通信世界)失败
MPI_SUM_check_dtype(106):未为此数据类型定义MPI_Op MPI_SUM操作
是否有合适的(或推荐的)方法来执行此操作,以使其适用于大多数编译器?严格来说,这是一个库问题(例如Intel MPI与Open MPI),而不是编译器问题(例如iPort与gfortran)。您可以尝试使用MPI\u INTEGER2,如果仍然无法使用,则应直接向英特尔报告。首先,
selected\u int\u kind(2)
很可能返回单字节类型。该参数不是字节数,而是十进制数字的精度,因此您要求的类型可以表示-100到+100之间的数字。其次,您应该将相同的值2
传递到MPI\u type\u create\u f90\u integer
,作为第一个参数。您不应该通过SIK2
。不幸的是,这些解决方案都不起作用:(i)MPI\u INTEGER2
不是受支持的类型(甚至不编译),这就是我必须自己创建该类型的原因;(ii)很高兴知道,小数位数从-100到+100的精度对我来说很好;(iii)我尝试在调用MPI\u TYPE\u CREATE\u F90\u INTEGER(2,int2type,ierr)中传递2
,它不会改变任何内容:(您正在使用哪个版本的IntelMPI?使用2018.3.222
和2019.4.243
进行编译和工作。我将缓冲区声明为INTEGER*2
,并使用MPI_INTEGER2
。如果问题仍然存在,请编辑您的问题并添加