gpt4 book ai didi

arrays - Fortran 函数返回数组时的最佳实践是什么?

转载 作者:行者123 更新时间:2023-12-05 00:46:09 26 4
gpt4 key购买 nike

假设我想编写一个将数组 作为输入的函数x 一维并返回另一个数组基于它的相同尺寸(为了说明它,我使用了一个将它乘以 2 的函数)。我对该代码有两个选择:

function times2(x) result(y)
real, intent(in) :: x(:)
real, allocatable :: y(:)

allocate(y(size(x))
y = 2*x
end function

或者
function times2(x,n) result(y)
real, intent(in) :: x(n)
integer, intent(in) :: n
real :: y(n)

y = 2*x
end function

我个人更喜欢第一个,因为调用者更容易使用,但我不确定哪个在内存方面更好,假设数组 x 可以很大,我不知道是不是更好延迟数组或自动数组。
无论如何,在现代 Fortran 中,哪种方法是最好的方法?

最佳答案

可能两者都不是,尽管与这些事情一样,答案取决于具体情况。

假设一个非元素操作,我倾向于编写这样一个函数(在一个模块中):

function times2(x) result(y)
real, intent(in) :: x(:)
real :: y(size(x))

y = 2*x
end function

上面有一个假定形状的虚拟参数,具有自动函数结果。它:
  • 写入 Fortran 95 标准时可用;
  • 在源代码中明确指定函数结果大小对函数参数的依赖性,这可能(或可能不会)帮助您的代码读者了解正在发生的事情(一个这样的读者是编译器本身,这可能有助于优化);
  • 可能(或可能不会)避免数组值的中间副本;
  • 可能(或可能不)需要空间用于函数结果或堆栈上的等效临时空间。

  • 如果操作是基本的(即每个元素上的相同操作,根据给出的实际示例),我会编写一个基本函数。此类函数的源采用标量参数并提供不可分配的非指针标量结果。
    elemental function times2(x) result(y)
    real, intent(in) :: x
    real :: y

    y = 2*x
    end function

    当函数结果的形状(或某些其他属性)无法通过简单的规范表达式来描述时,我通常使用延迟形状可分配函数结果。可分配函数结果:
  • 要求至少写入 Fortran 2003 标准;
  • 可能需要超出严格要求的额外堆内存分配/释放对,这可能(或可能不会)影响性能;
  • 可能不需要与自动结果情况相同的堆栈使用,这可能(或可能不会)避免在执行时出现堆栈溢出问题。

  • 编译器实现细节(包括编译器选项)会影响比较。特别是,编译器如何管理临时内存的差异可能会使这两种方法在堆栈和堆分配的要求方面趋于一致。

    除非您有特殊要求,否则请避免使用显式形状数组虚拟参数。

    关于arrays - Fortran 函数返回数组时的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54830213/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com