2016-07-26 7 views
0

Ich habe eigentlich eine verschachtelte Frage:Beste Erklärung Reihenfolge in Fortran?

  1. Ist die Reihenfolge der Variablendeklaration Materie in Fortran?
  2. Wenn ja, was ist die beste Reihenfolge um Variablen zu deklarieren?

Zum Beispiel ist dieses Programm:

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 ... 

besser als diese:

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 ... 

?

(von „besser“, meine ich in der Speicherverwaltung effizienter und schneller)

Vielen Dank für Ihre Antworten!

+2

Es gibt einen offensichtlichen Fall, in dem die Reihenfolge der Deklaration wichtig ist: wenn eine andere Deklaration in irgendeiner Weise davon abhängt. Aber Sie interessieren sich nicht für die "rechtlichen" Aspekte der Bestellung? – francescalus

Antwort

5

Nein, die Reihenfolge spielt keine Rolle, es sei denn, Ihre Deklaration hängt von einer zuvor deklarierten Entität ab. Offensichtlich

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

muss diese Reihenfolge verwenden, weil Sie an eine andere Stelle verweisen.

Wenn sie nicht voneinander abhängen, spielt es keine Rolle. Es spielt keine Rolle für die Effizienz in irgendeiner Weise. Für Stil kann jeder seine eigene Meinung haben, was die schönste Reihenfolge ist, kein Grund, das hier zu diskutieren.

Es in einem gemeinsamen Block Rolle könnte, denn dann können Sie einen Array zwingen zu einem ungünstigen Adresse im Speicher zu beginnen und schwieriger zu vektorisieren.

Es macht auch in bestimmten Art Erklärungen:

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

im Speicher anders als

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

und dass man wird anders als

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

denn ohne sequence Dem Compiler steht es frei, Padding einzufügen, was normalerweise der Fall ist in t3.

Interoperable Typen

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

auch Reihenfolge der Komponenten durchzusetzen, aber der Compiler kann die Polsterung für die Leistung umfassen. Es verwendet die Regeln des C-Compilers zum Auffüllen.

+0

Sie haben Recht, nicht sicher, ob es in diesem Thema ist, aber es kann erwähnt werden. –

+0

Bitte beachten Sie, dass "Sequenz" -Typen unglaublich restriktiv sind. Sie können das Attribut "Zeiger" nicht für Typkomponenten verwenden. Auch "allokierbare" Typ-Komponenten sind verboten, wenn Sie die "Äquivalenz" -Anweisung verwenden möchten. – jlokimlin

+0

Das weiß ich ganz gut, aber das ist nicht das Thema dieser Frage und Antwort überhaupt. –

0

ich dies tun würde ....

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 ... 

Dann gibt es keinen Zweifel, dass die Arrays auf 64-Byte-Grenzen sind. Es gibt auch Compiler-Optionen. In Fort ist es "-align array64byte". Dies wird nur einen Unterschied machen, wenn/wann Sie vektorisieren, was Sie tun sollten ... Daher sollten Sie die Arrays/Vektoren irgendwie ausrichten.