我实际上有一个嵌套的问题:
例如,这个程序是:
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 ...(我所说的“更好”是指内存管理的效率和速度)
谢谢你的回答!
发布于 2016-07-26 15:12:12
不,命令不重要,除非您的声明依赖于先前声明的实体。
显然
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编译器的规则填充。
发布于 2016-07-27 08:20:57
我会这么做..。
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 64字节’。这只会产生不同的情况,如果/当你向向量,你应该要做.因此,您应该以某种方式对齐数组/向量。
https://stackoverflow.com/questions/38593518
复制相似问题