2017-09-02 50 views
1

我的代碼的那種像這樣的F90:如何僅使用一個索引遍歷數組?

real(8), dimension(10,10,10) :: A 

do i = 1, 1000 

print*,A(i,1,1) 

enddo 

我很驚訝這個工作,這比簡單地i,j,k循環超過3名維更快。

有人可以解釋爲什麼這個工程?

+0

比什麼更快?你在代碼中究竟有什麼不明白的地方? –

+0

數組A的維數爲10X10X10,那麼當索引i超過10時,爲什麼上面提供的代碼工作?而且它比下面更快, 做我= 1,10 做J = 1,10 做K = 1,10 打印*,A(I,J,K) ENDDO ENDDO ENDDO – user8553012

回答

5

您的代碼是非法的。但是在引擎蓋下,數組的內存佈局正好處於列的主要順序中,就像在三重循環k,j,i中一樣,所以代碼看起來可行。但它是非法的。

如果您在編譯器中啓用了運行時錯誤檢查(請參閱手冊),它會找到該錯誤並進行報告。

如果您不啓用編譯器優化,可能會稍微快一點,因爲嵌套循環中有一些開銷,但優化編譯器會將代碼優化爲一個循環。

如果你真的做了(你應該總是顯示您的代碼!

do i=1,10 
    do j=1,10 
    do k=1,10 
     something with A(i,j,k) 

,那麼請注意,這是錯誤的順序,你應該循環中K,J,我命令。

另外請注意,測量打印到屏幕上的速度是沒有用的,可能會非常棘手。一些數學運算更有用。

+0

謝謝您回答! 雖然我遵從mpif90 -O3 -heaparrays -cpp ,並且A(i,1,1)的情況幾乎比A(i,j,k)快10倍。 我用A做的是一些計算,但打印。上面的代碼是我從開源代碼中學到的。非常困惑 – user8553012

+0

打印1000行不是一個真正瓶頸的很好例子。試圖對小而複雜的事物進行計時可能會產生誤導。 – Ross

+0

在三維情況下,您執行循環的順序是什麼?弗拉基米爾說這是非常重要的,並且在很多情況下會導致性能差異的一個數量級 –