2016-07-26 2 views
0

У меня есть на самом деле вложенный вопрос:Лучший заказ объявления в Фортране?

  1. ли порядок объявления переменных вещества в Fortran?
  2. Если да, то какой лучший порядок объявлять переменные?

Например, эта программа:

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

лучше, чем это:

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

?

(от «лучше», я имею в виду эффективным в управлении памятью и быстрее)

Спасибо за ваши ответы!

+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' являются невероятно ограничительными. У вас не может быть атрибут 'pointer' для компонентов типа. Кроме того, 'typeatable' type-components запрещены, если вы хотите использовать оператор' equalence'. – 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-байтовых. Существуют также опции переключателя компилятора. В форте это '-align array64byte'. Это будет иметь значение только в том случае, если/если вы векселируете, что вы должны делать ... Следовательно, вы должны каким-то образом выровнять массивы/векторы.

Смежные вопросы