Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory management 带有Fortran和2字节整数的MPI_ALLreduce_Memory Management_Fortran_Mpi - Fatal编程技术网

Memory management 带有Fortran和2字节整数的MPI_ALLreduce

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

我正在尝试进行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, 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
。如果问题仍然存在,请编辑您的问题并添加