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
如何使用MPI更改Fortran中的默认精度?_Fortran_Mpi_Gfortran - Fatal编程技术网

如何使用MPI更改Fortran中的默认精度?

如何使用MPI更改Fortran中的默认精度?,fortran,mpi,gfortran,Fortran,Mpi,Gfortran,我想把一个大型Fortran 90程序改为使用双精度而不是单精度。我认为最简单的方法是向编译器添加以下标志: -fdefault-real-8 但是,这似乎并没有更新MPI命令。例如,我需要更改如下命令: CALL MPI_RECV(x, n, MPI_REAL, rankstart, tag, comm, stat, ierr) 到 您知道是否有编译器标志将MPI\u REAL的默认值更改为MPI\u REAL8?如果没有,您知道另一种方法吗?我可以轻松更改程序的精度,而无需手动调整代码中

我想把一个大型Fortran 90程序改为使用双精度而不是单精度。我认为最简单的方法是向编译器添加以下标志:

-fdefault-real-8
但是,这似乎并没有更新MPI命令。例如,我需要更改如下命令:

CALL MPI_RECV(x, n, MPI_REAL, rankstart, tag, comm, stat, ierr)


您知道是否有编译器标志将
MPI\u REAL
的默认值更改为
MPI\u REAL8
?如果没有,您知道另一种方法吗?我可以轻松更改程序的精度,而无需手动调整代码中的所有命令?

您可以在配置MPI库进行编译时使用相同的标志。在这种情况下,只要库编程正确,默认实数应该与您选择的默认类型相对应

库可能会要求默认整数和逻辑与新的放大实数具有相同的存储大小

请注意,MPI是一个外部库。它是单独编写的。它不会对编译程序时提供给编译器的标志作出反应。它只知道用于编译库的标志。


在Fortran 90程序中更改精度的最简单方法是使用工作类型参数

integer, parameter :: rp = kind(1.d0)
并将实际变量声明为

real(rp) :: x

您可以稍后将参数值更改为任何其他值,如

@peanutelex所示,这对您没有任何帮助。您必须重新编译库。参见,例如,参见链接。但是,修复代码可能是一项更好的时间投资。看看MPI类型、创建类型、f90类型和类似类型,优雅并不一定意味着行数更少。注意:MPI_REAL4和类似产品不是最好的选择,因为它们不需要MPI实现支持。我还要支持Vladimir的评论“修复代码可能是更好的时间投资”。就我个人而言,我有一种直觉,用非默认数据类型大小重新编译一个库,如MPI,将是我所说的最好的例子,每当我看到人们建议——fdefault-real-8和类似的——如果不这样做,它只会导致痛苦的生活。哎呀,无线连接断了。啊,使用-fdefault-real-8编译MPI库和OP的代码绝对是错误的方法!-fdefault-real-8选项会破坏Fortran的存储关联规则,如果支持四精度,则双精度将升级为四精度(即,
real(8)
变为
real(16)
)。该选项的目的是帮助将代码移植到不同的精度,而不是取代该移植。-fdefault-real-8永远不是移植代码的正确方法。不幸的是,gfortran开发者的法定人数拒绝删除该选项。
real(rp) :: x