我有以下问题:
Fortran90+ 中分配/取消分配语句的实际开销是多少?
即,在循环内分配几个中等大小的数组,例如
do i = 1, 1000
allocate(tmp(20))
tmp(1:20) = 1d0
call foo(tmp)
deallocate(tmp)
end do
在这种情况下,是否值得根据最大大小分配单个工作数组?
我发现紧密循环内的动态数组分配确实会减慢代码的执行速度,valgrind 显示大部分周期被占用malloc
and free
. So if foo
是一个非常快的函数,那么静态分配这个数组是值得的。通过使用以下内容进行分析很容易看到这种开销valgrind http://valgrind.org/docs/manual/manual.html的 callgrind 功能(减少问题的大小可能是值得的,因为分析的执行速度可能至少慢 10 倍)。
Fortran 2008 对于此类问题有一个更好的解决方案。您可以在 a 中声明变量block
构造具有运行时确定的大小。这应该使编译器更容易在堆栈上分配变量。不过我个人没有使用过这个,我不确定哪些编译器支持它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)