我有一个示例程序在fortran中执行矩阵操作,该操作具有列主要系统来存储矩阵。在两个数组操作中,这是否会在运行时造成显着差异?如果是这样,有人可以解释为什么会发生这种情况,究竟是什么导致了如此大的运行时差异?为什么这些fortran 95循环方法的执行时间不同?
我在GNU Fortran 4.8.4上使用了Ubuntu 14.04。
代码:
program main
implicit none
integer :: i,j
real :: start, finish
real,dimension(256,256) :: arr1
!ROW format - put 0 to main diagonal
call cpu_time(start)
do i=1,255,1
do j=1,255,1
arr1(i,j)=0
end do
end do
call cpu_time(finish)
write(*,100) 'Execution time arr(i,j) in seconds= ', (finish-start)
100 format (A,f12.9)
!COLUMN format - put 1 to main diagonal
call cpu_time(start)
do j=1,255,1
do i=1,255,1
arr1(i,j)=1
end do
end do
call cpu_time(finish)
write(*,100) 'Execution time arr(j,i) in seconds = ', (finish-start)
end program
编译:
gfortran main.f95 -o main
输出:
Execution time arr(i,j) in seconds= 0.000736000
Execution time arr(j,i) in seconds = 0.000164000
第一种方法是需要大约4.5倍的执行时间比第二方法。
编辑: 我知道为什么在执行时间中存在如此大的差异(在编辑器或处理器或内存级别发生行时,我们进行主要排序等时)会更有趣,而不是简单地将-o3
标记或优化代码。这个问题optimization of a seven do cycle有一个答案,说列主要顺序更好。为什么这样?
我的问题不同于这个问题的地址。在我的问题中更新了'编辑'部分。 –
这是一个明智的问题,但是知道你有什么基本的理解或者你想要的深度是有帮助的。当然,您可以深入讨论缓存和访问模式,但同样,“数组元素顺序”可能足以满足您的需求。我无法分辨你想要什么或需要什么。目前你的第一个问题是“这个订单重要吗?”这表明需要非常高水平的答案,但后来你说你明白了。 – francescalus
我有兴趣了解背后的详细原因,正如你所说的那样,与缓存相关。事实上,我只是在我的问题中更新了这一点。 –