数组维度的排序

Ordering of array dimensions

给定以下代码:

integer, parameter :: n = 10000
integer, parameter :: m = 3

real, dimension(:,:), allocatable :: arr

! First way
allocate(arr(n,m))

! Second way
allocate(arr(m,n))

当两个维度相差较大时,"best"分配arr的方式是什么,第一种方式还是第二种方式?这有关系吗,还是很大程度上取决于 arr 的使用方式?

Fortran column-major,即第一个维度变化最快。

维度的最佳选择取决于您的问题: 如果arr是一个3D的坐标列表space,而你通常对这些坐标进行操作,你应该选择第二个选项:

allocate(arr(m,n))
arr(:,1) = [x, y, z]
! ...

然后,每个坐标都有一个连续的布局。

如果您有三个长度为 n = 10000 的向量(例如三个右侧),选项一将为每个向量提供连续的块。

总而言之:这取决于您要做什么。

如果有差异,那是与顺序内存访问、内存提取优化和缓存的特性相关的次要差异。

否则不用担心。只需让程序正常运行即可。如果以某种方式需要从中挤出更多几纳秒的性能,那么,无疑有更好的地方可以消耗精神能量来获得它。

如果您将数组的切片传递给函数,那么差异就很重要了。