我有一个用Fortran编写的矩阵操作示例程序,它使用列主系统来存储矩阵。这是否会导致两个数组操作的运行时间差异如此之大?如果是这样,有人可以解释一下为什么会发生这种情况,以及到底是什么导致了如此大的运行时间差异吗?
我正在使用Ubuntu 14.04和GNU Fortran 4.8.4。
代码:
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
标志或优化代码。这个问题优化七重循环有一个回答说列主序排序更好。为什么呢?