2016-07-13 45 views
0

由於Fortran使用列優先順序,是否意味着使用向量比使用數組要快?由於列主要順序,1D陣列是否比2D陣列更快?

考慮下面的例子。方法2是否比方法1慢,因爲方法2連續訪問A(ii,1)A(ii,2),它們在內存中是分開的?

program main 

implicit none 
real*8 :: A(10,2) 
real*8 :: A1(10),A2(10),B(10) 
integer :: ii,jj 

do jj=1,2 
    do ii=1,10 
    A(10,2)=dble(ii)+(jj) 
    end do 
end do 
A1=A(:,1) 
A2=A(:,2) 

! Method 1 
do ii=1,10 
    B(ii)=A1(ii)+A2(ii) 
end do 

! Method 2 
do ii=1,10 
    B(ii)=A(ii,1)+A(ii,2) 
end do 

end program main 
+2

您是否嘗試過測量它?你發現了什麼? Fortran中沒有*向量*,所有顯示的都是一個數組。 –

+0

同樣,'A1(ii)'不在內存中的'A2(ii)'旁邊。這裏有關於編譯器,硬件和所有事情的問題。 – francescalus

+0

OP可能會感興趣http://stackoverflow.com/questions/38353830/how-to-choose-the-best-configuration-of-2d-array-ai-j –

回答

1

這兩個例子應該沒​​有什麼區別。在這兩種情況下,你只需循環連續的元素順序。一般而言,A(1,1)A(1,2)可能在內存上比A1(ii)A2(ii)更接近,但它應該沒有區別。

0

您的方法1和方法2兩者同樣好。

考慮一下,如果順序顛倒......

Do ii=1,10 
    B(ii)=A(1,ii)+A(2,ii) 
end d0 

沒有辦法vectorise該循環(至少不能沒有收集),因爲它是不連續的。它變得很重要,當循環變大或被稱爲很多時。

從某種意義上說,您的方法2比方法1更有意義。試想一下:

method4 
real :: A(20) 
Do ii=1,10 
    B(ii) =A(ii) + A(ii+10) 
End do 

您需要在$ OMP定義safelen(10),而陣列形式更容易自動vectorise!