有关我们应该在何处分配阵列的建议或最佳做法是什么?
例如,如果我有一个(我的简化版)程序,我将在主程序中分配输出变量(感兴趣的变量)。这个主程序调用子程序foo
,子程序又调用子程序foo2
,子程序进行实际计算。
我的问题是应该在哪里进行分配的最佳/推荐做法。
foo2
进行实际计算,是否应该分配数组?foo
调用foo2
,则应foo
分配数组并foo2
执行此操作
只是计算?如果它很重要,我有一个名为global的模块,它包含主程序的派生类型,以及代码的主要参数,例如每个数组的大小(Ni
,{{1} },容差等)
Nj
是什么
答案 0 :(得分:2)
出于性能原因,避免在低级子例程和函数中进行分配确实是一种好习惯。从[1]中可以看出,简单的加法需要大约1-3个CPU周期,分配和释放对(“小”数组)可能需要200到500个CPU周期。
我建议你使用“work”变量作为输入编写一个子程序,并可能在适当的位置操作(即用结果覆盖输入),例如
subroutine do_computation(input,output,work1,work2)
work1 = ...
work2 = ...
output = ...
end subroutine
您可以创建一个包装函数,为方便起见进行分配:
subroutine convenient_subroutine(input,output)
allocate(work1(...),work2(...)
call do_computation(input,output,work1,work2)
deallocate(work1,work2)
end subroutine
当性能不重要时,您可以调用convenient_subroutine
,否则您调用do_computation
尝试在循环迭代之间和不同的其他子例程之间共享工作数组。
[1] http://ithare.com/infographics-operation-costs-in-cpu-clock-cycles/