Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.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
Multithreading Fortran基本函数与基本子程序_Multithreading_Performance_Fortran_Parallel Processing_Fortran90 - Fatal编程技术网

Multithreading Fortran基本函数与基本子程序

Multithreading Fortran基本函数与基本子程序,multithreading,performance,fortran,parallel-processing,fortran90,Multithreading,Performance,Fortran,Parallel Processing,Fortran90,Fortan允许基本子例程具有intent(inout)和intent(out)参数,但只允许基本函数具有intent(in) 为什么呢?这只是一种风格上的惯例,还是调用函数和调用子例程有什么不同 换句话说, Elemental Integer Function FOO(i) Integer, intent(in) :: i ... FOO=something End Function 及 -FOO的这些实现是否等效有效?没有至少一个参数标记为intent(out)或inten

Fortan允许基本子例程具有intent(inout)和intent(out)参数,但只允许基本函数具有intent(in)

为什么呢?这只是一种风格上的惯例,还是调用函数和调用子例程有什么不同

换句话说,

Elemental Integer Function FOO(i)
  Integer, intent(in) :: i
    ...
  FOO=something
End Function


-FOO的这些实现是否等效有效?

没有至少一个参数标记为
intent(out)
intent(inout)
的基本子例程是没有意义的,因为您必须以某种方式传递结果。函数有其返回值,子例程必须使用其参数。在Fortran 2008中,AFAIK基本过程不必是纯过程,但很难想象一个有用的基本子例程仅仅是通过它的副作用来实现的。

我想不出来,如果它有副作用,那么称它为纯过程没有多大意义。我想冒昧地猜测一下,在并行化环境下,基本函数可能更有效,因为编译器很清楚该过程是如何运行的。我认为,如果一个子例程只修改自己的参数,而不涉及全局变量,那么高效地编译这样的子例程并不困难。拥有这样的功能是有意义的。例如,随机数生成器应该修改随机数序列的状态(由整数数组描述)并返回随机数。所以它应该有一个intent(inout)和一个intent(out)参数。当然,用户可能会通过将共享变量传递给这样的子例程而把事情搞砸。但话说回来,没有哪种编程范式是万无一失的。
Elemental Subroutine FOO(i, v)
  Integer, intent(in)  :: i
  Integer, intent(out) :: v
    ...
  v=something
End Subroutine