Fortran分配/解除分配

Iva*_*ets 8 performance fortran memory-management

我有以下问题:Fortran90 +中的allocate/deallocate语句的实际开销是多少?即,在循环内部分配了几个中型数组,如

do i = 1, 1000
    allocate(tmp(20))
    tmp(1:20) = 1d0
    call foo(tmp)
    deallocate(tmp)
end do 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,是否值得根据最大大小分配单个工作数组?

Dav*_*veP 7

我发现紧密循环中的动态数组分配确实会减慢我的代码的执行速度,而valgrind显示大部分循环都被mallocfree.因此,如果foo是一个非常快速的函数,那么值得静态分配这个数组.通过使用valgrind的callgrind功能进行性能分析很容易看到这种开销(由于配置文件的执行速度至少要慢10倍,因此可能值得减小问题的大小).

在fortran 2008中,有一个更好的解决方案来解决这类问题.您可以在block构造中声明变量,其大小在运行时确定.这应该使编译器更容易在堆栈上分配变量.但是我个人并没有使用它,我不确定哪些编译器支持它.