建议在Fortran中放置数组分配的做法

时间:2018-06-12 20:26:13

标签: arrays fortran allocation

有关我们应该在何处分配阵列的建议或最佳做法是什么?

例如,如果我有一个(我的简化版)程序,我将在主程序中分配输出变量(感兴趣的变量)。这个主程序调用子程序foo,子程序又调用子程序foo2,子程序进行实际计算。 我的问题是应该在哪里进行分配的最佳/推荐做法。

  • 如果foo2进行实际计算,是否应该分配数组?
  • 如果foo调用foo2,则应foo分配数组并foo2执行此操作 只是计算?
  • 我应该编写一个新的函数/子程序来分配数组吗?
  • 或者最好在主程序上分配并将数组作为传递 假定形状?

如果它很重要,我有一个名为global的模块,它包含主程序的派生类型,以及代码的主要参数,例如每个数组的大小(Ni,{{1} },容差等)

Nj

是什么

1 个答案:

答案 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/