给出以下代码:
integer, parameter :: n = 10000
integer, parameter :: m = 3
real, dimension(:,:), allocatable :: arr
! First way
allocate(arr(n,m))
! Second way
allocate(arr(m,n))
什么是最好的"当两个维度(第一种方式或第二种方式)存在较大差异时,分配arr
的方法是什么?它是否重要,或者它是否与arr
的使用方式有很大关系?
答案 0 :(得分:5)
Fortran是column-major,即第一个维度变化最快。
尺寸的最佳选择取决于您的问题:
如果arr
是3D空间中的坐标列表,并且您通常对这些坐标进行操作,则应该选择第二个选项:
allocate(arr(m,n))
arr(:,1) = [x, y, z]
! ...
然后,每个坐标都有一个连续的布局。
如果您有三个长度为n = 10000
的向量(例如三个右侧),则选项1会为每个向量提供连续的块。
总之:这取决于你想要做什么。
答案 1 :(得分:-1)
如果存在差异,则与次序内存访问,内存提取优化以及缓存的特性相关,这是次要的。
否则,不要担心。只需使程序正常工作即可。如果不知何故需要将几纳秒的性能从其中挤出来,那么,毫无疑问,消耗精神能量无疑是更好的地方。
如果要将数组的切片传递给函数,则差异很大。