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

时间:2017-06-27 07:53:44

标签: arrays fortran

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

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

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

2 个答案:

答案 0 :(得分:6)

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

在旧的子程序中,你有一长串的参数,然后有一两个工作数组:

   call SUB(N1, N2, N3, M1, M2, M3, A, B, C, WRK, IWRK)

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

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

由于false sharing,在内存中关闭一些数量的BTW甚至可能是有害的。

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

答案 1 :(得分:1)

一般情况下(独立于所使用的编程语言):拥有“连续”的好块,任何事情都会有所帮助。

操作系统,甚至硬件都可能受益在内存中只有一个巨大的部分来处理;相比看50或100个不同的位置。

此类讨论的良好开端就是这个question

但我同意100%的答案:除非你使用这些技术获得大量性能提升,否则你应该总是喜欢编写“干净”(又名可读)的代码。这转化为避免这种做法。