首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >福特兰最好的报关单?

福特兰最好的报关单?
EN

Stack Overflow用户
提问于 2016-07-26 15:04:49
回答 2查看 550关注 0票数 0

我实际上有一个嵌套的问题:

  1. 变量声明的顺序在Fortran中重要吗?
  2. 如果是,声明变量的最佳顺序是什么?

例如,这个程序是:

代码语言:javascript
复制
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 ...

比这个更好:

代码语言:javascript
复制
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 ...

(我所说的“更好”是指内存管理的效率和速度)

谢谢你的回答!

EN

回答 2

Stack Overflow用户

发布于 2016-07-26 15:12:12

不,命令不重要,除非您的声明依赖于先前声明的实体。

显然

代码语言:javascript
复制
  integer, parameter :: arr(*) = [1,2,3]
  integer :: arr2(size(arr))

必须使用此顺序,因为您引用的是另一个实体。

如果他们不互相依赖,那就无关紧要了。从任何方面来说,效率都无关紧要。对于风格,每个人都可以有自己的意见,什么是最好的顺序,没有理由在这里讨论。

这在公共块中可能很重要,因为这样就可以强制数组从内存中一个不方便的地址开始,并且更难矢量化。

在某些类型的声明中,这也很重要:

代码语言:javascript
复制
  type t1
    sequence
    integer(int32) :: field1
    integer(int16) :: field2
  end type

在内存中的布局将不同于

代码语言:javascript
复制
  type t2
    sequence
    integer(int16) :: field2
    integer(int32) :: field1
  end type

而这一次与

代码语言:javascript
复制
  type t3
    integer(int16) :: field2
    integer(int32) :: field1
  end type

因为没有sequence,编译器就可以自由地插入一些填充,并且它通常会在t3中这样做。

互操作类型

代码语言:javascript
复制
   type, bind(C) :: t3
     ...

也可以强制执行组件的顺序,但是编译器可以包括填充以提高性能。它将使用C编译器的规则填充。

票数 5
EN

Stack Overflow用户

发布于 2016-07-27 08:20:57

我会这么做..。

代码语言:javascript
复制
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字节’。这只会产生不同的情况,如果/当你向向量,你应该要做.因此,您应该以某种方式对齐数组/向量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38593518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档