英特尔MPI_SIZEOF不适用于Fortran复杂类型
给定以下fortran代码:英特尔MPI_SIZEOF不适用于Fortran复杂类型,fortran,mpi,intel-fortran,Fortran,Mpi,Intel Fortran,给定以下fortran代码: integer, parameter :: double = kind(1.0d0) integer :: integerTest real(double) :: doubleTest complex(double) :: complexTest integer :: testSize integer :: ierr integerTest = 0 doubleTest = real(0.d0, kind=double) complexTest = cmplx(
integer, parameter :: double = kind(1.0d0)
integer :: integerTest
real(double) :: doubleTest
complex(double) :: complexTest
integer :: testSize
integer :: ierr
integerTest = 0
doubleTest = real(0.d0, kind=double)
complexTest = cmplx(0.d0, 0.d0, kind=double)
call MPI_SIZEOF(integerTest, testSize, ierr)
! ...
call MPI_SIZEOF(doubleTest, testSize, ierr)
! ...
call MPI_SIZEOF(complexTest, testSize, ierr)
使用“英特尔MPI”编译时,出现以下错误:
error #6285: There is no matching specific subroutine for this generic subroutine call. [MPI_SIZEOF]
在线
call MPI_SIZEOF(complexTest, testSize, ierr)
此代码使用OpenMPI编译和执行时没有问题。这个错误的原因是什么?它似乎在寻找与
complexTest
类型的特定匹配,但MPI_SIZEOF
的全部目的不是为了一般地处理几乎任何类型吗?可能是MPI库中的一个bug,他们可能忘记了将此特定函数添加到模块中。顺便说一句,“几乎任何类型”都是错误的,MPI_SIZEOF
只适用于内部类型
作为一种解决方法,您可以使用
testSize = storage_size(complexTest) / character_storage_size
(或者只是
/8
)可能是MPI库中的一个错误,他们可能忘记了将此特定函数添加到模块中。顺便说一句,“几乎任何类型”都是错误的,MPI_SIZEOF
只适用于内部类型
作为一种解决方法,您可以使用
testSize = storage_size(complexTest) / character_storage_size
(或者只是
/8
)将complexTest
声明为类型complex
,没有种类
,但这不是一个解决方案。如果将complexTest
声明为双复数
,也会失败。这可能是英特尔MPI中的一个错误。您应该能够使用存储\u size(),英特尔MPI中的MPI\u SIZEOF
支持非常有限的一组内部类型-请参阅我对Vladimir答案的最后一点评论。将complexTest
声明为typecomplex
而不使用种类
是有效的,但这不是一个解决方案。如果我将complexTest
声明为double complex
,它也会失败。这可能是英特尔MPI中的一个错误。您应该能够使用存储大小()
标准Fortran内部版本(仅转换为字节)。您是使用使用mpi
还是包含“mpif.h”
?显然,“英特尔mpi”中的mpi大小f
支持非常有限的内部类型集-请参阅我对Vladimir答案的最后一点评论。根据该标准,它应该适用于任何内部Fortran类型,而不仅仅是数字类型。@HristoIliev我在MPI 3.1 p.628中有“在x中有一个内部数字类型的Fortran变量(选择)”。尽管我看不出不包含逻辑和字符的原因。派生的内部类型可能不是非常有用。是的,但上面的句子读作“任何Fortran内部类型”。我冒昧地从英特尔mpi 5.1(希望英特尔不会起诉我)中撤销了mpi_sizeofs.mod,从特定子例程的名称中,我猜泛型接受标量和1d数组,包括整数
,实数
,逻辑
,字符
,复数
,DOUBLE
、INTEGER*1
、INTEGER*2
和INTEGER*8
用于X
。根据标准,它应该适用于任何固有的Fortran类型,而不仅仅是数值类型。@hristoilev我在X中有一个“数值固有类型的Fortran变量(选项)”在MPI3.1p.628.1中,虽然我看不出不包含逻辑和字符的原因。派生的内部类型可能不是非常有用。是的,但上面的句子读作“任何Fortran内部类型”。我冒昧地从英特尔mpi 5.1(希望英特尔不会起诉我)中撤销了mpi_sizeofs.mod,从特定子例程的名称中,我猜泛型接受标量和1d数组,包括整数
,实数
,逻辑
,字符
,复数
,DOUBLE
,INTEGER*1
,INTEGER*2
,以及INTEGER*8
用于X
。