使用巨型工作空间数组用于Fortran子例程

Par*_*dox 2 arrays fortran

我常常在查看线性代数子程序的遗留Fortran代码时,注意到这一点:

他们不是使用一堆独立的数组,而是将所有数组连接成一个大的工作空间数组,并使用指针来划分变量的开始位置.

它们甚至将独立的非数组变量连接成数组.这样做是否有好处,如果我想编写优化代码,我应该这样做吗?

Vla*_*r F 6

不,如果你想要保持理智,不要这样做.这是20世纪60年代至80年代的一种做法,当时没有可能的动态分配,他们只想在参数列表中使用少量的工作数组.

在旧的子例程中,您有一长串参数,然后是一个或两个工作数组:

   call SUB(N1, N2, N3, M1, M2, M3, A, B, C, WRK, IWRK)
Run Code Online (Sandbox Code Playgroud)

如果你需要传递10个工作数组而不是一个,那么调用它就太难了.

但在21世纪,最重要的是保持代码的可读性和清晰性,并且只有在优化之后才能保持代码的清晰.

由于错误共享,在内存中关闭一些数量的BTW甚至可能是有害的.

这并不意味着你应该过多地分解你的记忆,但是当你确实按顺序访问它时,将它们保持在一起是有意义的.这就是为什么使用数组结构而不是结构数组的原因.