2016-07-26 75 views
0

其實我也嵌套問題:Fortran中最好的聲明順序?

  1. 是否Fortran語言的變量聲明事項的順序?
  2. 如果是,那麼聲明變量的最佳順序是什麼?

例如,是這樣的程序:

PROGRAM order2 
IMPLICIT NONE 
LOGICAL :: boolean1,boolean2 
INTEGER :: int1,int2 
INTEGER,DIMENSION(:),ALLOCATABLE:: array_int_1D 
DOUBLE PRECISION,DIMENSION(:),ALLOCATABLE:: array_double_1D 
DOUBLE PRECISION,DIMENSION(:,:),ALLOCATABLE:: array_double_2D 
... instructions ... 

:比這

PROGRAM order1 
IMPLICIT NONE 
DOUBLE PRECISION,DIMENSION(:,:),ALLOCATABLE:: array_double_2D 
DOUBLE PRECISION,DIMENSION(:),ALLOCATABLE:: array_double_1D 
INTEGER,DIMENSION(:),ALLOCATABLE:: array_int_1D 
INTEGER :: int1,int2 
LOGICAL :: boolean1,boolean2 
... instructions ... 

更好?

(由「好」,我的意思是在內存管理效率和更快)

謝謝您的回答!

+2

有一個明顯的例子,聲明的順序很重要:當另一個聲明以某種方式依賴它時。但是你不關心訂單的「合法」方面? – francescalus

回答

5

不,訂單無關緊要,除非您的聲明依賴於先前聲明的實體。

很明顯,因爲你提到的另一個實體

integer, parameter :: arr(*) = [1,2,3] 
    integer :: arr2(size(arr)) 

必須使用此命令。

如果他們不依賴彼此,那並不重要。以任何方式提高效率並不重要。對於風格,每個人都可以有自己的意見,最好的命令是什麼,沒有理由在這裏討論。

可以不管在公共塊,因爲這樣你可以強制數組開始在不方便的地址在內存中,更難以量化。

它也很重要在某些類型聲明:

type t1 
    sequence 
    integer(int32) :: field1 
    integer(int16) :: field2 
    end type 

將內存比

type t2 
    sequence 
    integer(int16) :: field2 
    integer(int32) :: field1 
    end type 

進行佈局不同,一個不同於

type t3 
    integer(int16) :: field2 
    integer(int32) :: field1 
    end type 

因爲沒有sequence編譯器可以自由地插入一些填充,它通常會這樣做在t3

可互操作的類型

type, bind(C) :: t3 
    ... 

也執行的組件的順序,但是編譯器可以包括用於性能的填充。它將使用C編譯器的填充規則。

+0

你是對的,不確定它是否在這個主題中,但可以提及。 –

+0

請注意,'sequence'類型是非常有限的。你不能擁有type-components的'pointer'屬性。另外,如果你想使用'equivalence'語句,'allocatable'類型組件是被禁止的。 – jlokimlin

+0

我很清楚,但這不是這個問題的答案。 –

0

我會做這個....

PROGRAM order1 
IMPLICIT NONE 
!DIR$ ATTRIBUTES ALIGN:  array_double_2D::64 
DOUBLE PRECISION,DIMENSION(:,:),ALLOCATABLE:: array_double_2D 
!DIR$ ATTRIBUTES ALIGN:  array_double_1D::64 
DOUBLE PRECISION,DIMENSION(:) ,ALLOCATABLE:: array_double_1D 
!DIR$ ATTRIBUTES ALIGN:  array_int_1D::64 
INTEGER,DIMENSION(:)   ,ALLOCATABLE:: array_int_1D 
INTEGER :: int1,int2 
LOGICAL :: boolean1,boolean2 
... instructions ... 

那麼毫無疑問的是,陣列上的64個字節邊界。 還有編譯器開關選項。在堡壘中它是'對齊陣列64字節'。 這隻會在你做矢量化時有所作爲,你應該這樣做......因此,你應該以某種方式對齊數組/矢量。