排列数组维度

时间:2015-05-15 15:42:00

标签: arrays fortran

给出以下代码:

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的使用方式有很大关系?

2 个答案:

答案 0 :(得分:5)

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

尺寸的最佳选择取决于您的问题: 如果arr是3D空间中的坐标列表,并且您通常对这些坐标进行操作,则应该选择第二个选项:

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

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

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

总之:这取决于你想要做什么。

答案 1 :(得分:-1)

如果存在差异,则与次序内存访问,内存提取优化以及缓存的特性相关,这是次要的。

否则,不要担心。只需使程序正常工作即可。如果不知何故需要将几纳秒的性能从其中挤出来,那么,毫无疑问,消耗精神能量无疑是更好的地方。

如果要将数组的切片传递给函数,则差异很大。