数组维度的排序
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
的向量(例如三个右侧),选项一将为每个向量提供连续的块。
总而言之:这取决于您要做什么。
如果有差异,那是与顺序内存访问、内存提取优化和缓存的特性相关的次要差异。
否则不用担心。只需让程序正常运行即可。如果以某种方式需要从中挤出更多几纳秒的性能,那么,无疑有更好的地方可以消耗精神能量来获得它。
如果您将数组的切片传递给函数,那么差异就很重要了。
给定以下代码:
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
的向量(例如三个右侧),选项一将为每个向量提供连续的块。
总而言之:这取决于您要做什么。
如果有差异,那是与顺序内存访问、内存提取优化和缓存的特性相关的次要差异。
否则不用担心。只需让程序正常运行即可。如果以某种方式需要从中挤出更多几纳秒的性能,那么,无疑有更好的地方可以消耗精神能量来获得它。
如果您将数组的切片传递给函数,那么差异就很重要了。