我在F90中有类似的代码:
real(8), dimension(10,10,10) :: A
do i = 1, 1000
print*,A(i,1,1)
enddo
我非常惊讶这是有效的,它比通过i,j,k
简单地循环3个维度更快。
有人可以解释为什么会有效吗?
答案 0 :(得分:5)
您的代码是非法的。但是在引擎盖下,阵列的内存布局恰好是在三维循环k,j,i中的列主要顺序,因此代码似乎有效。但这是非法的。
如果在编译器中启用运行时错误检查(请参阅手册),它将找到错误并报告错误。
如果不启用编译器优化,可能会稍微快一点,因为嵌套循环中存在一些开销,但优化编译器会将代码优化为一个循环。
如果您确实这样做了(您应该始终显示您的代码!!! )
do i=1,10
do j=1,10
do k=1,10
something with A(i,j,k)
然后请注意,这是错误的顺序,你应该循环k,j,i顺序。
另请注意,测量打印到屏幕的速度是没有用的,可能非常棘手。一些数学运算更有用。