【问题标题】:Does the target attribute affect efficiency of Fortran programs?目标属性是否影响 Fortran 程序的效率?
【发布时间】:2013-06-19 15:52:48
【问题描述】:

我已经阅读了difference between POINTER and ALLOCATABLEWhy does a Fortran POINTER require a TARGET?,他们的答案非常好。

似乎最有效的选择是对大数组使用可分配对象,对链表、树等使用指针。

现在,如果我有一个高效的可分配变量,目标属性会以某种方式影响它的访问方式或编译器如何使用它优化代码吗?这样做是否可取?

例如,我可以想到我的坐标三元组:

real, dimension(:),allocatable :: x,y,z

在子程序中,我想使用指针以循环方式指向它们。

【问题讨论】:

    标签: performance pointers fortran


    【解决方案1】:

    如果您想置换方向(即 (x,y,z) --> (y,z,x)),则不需要指针,因为您可以将 if-else 条件与可分配对象一起使用:

        if(dir == 1) then
           allocate(x(1:nx),y(1:ny),z(1:nz))
        elseif(dir == 2) then
           allocate(x(1:ny),y(1:nz),z(1:nx))
        elseif(dir == 3) then
           allocate(x(1:nz),y(1:nx),z(1:ny))
        endif
    

    这应该会启用代码重用,因为您的平行方向始终位于 x 中,垂直方向位于 yz 中。

    【讨论】:

    • 感谢您的回复。我仍然想知道目标属性对可分配变量的影响。
    • 并非所有编译器都要求可分配变量具有目标属性。 target 属性主要用于告诉编译器该变量可能有别名。然后编译器可以决定生成更高效的代码。它非常依赖于编译器。最简单的方法就是在代码中设置断点,看看有没有target属性的代码生成的区别。
    【解决方案2】:

    这听起来取决于编译器,我个人不知道编译器开发人员在实践中如何处理这种情况。但是,这可能取决于派生数据类型的大小/复杂性以及子程序中使用的 {intent(in)、intent(out)、intent(inout)} 的类型。比较以下类型:

    type ex1
       real :: a ! only one member
    end type ex1
    

    type ex2
    real, dimension(:), allocatable :: a    ! member 1
    type(complicated), allocatable  :: b(:) ! member 2
    type(more_complicated) :: c
    ! :
    ! :
    !                           still has more 200 members!
    end type ex2
    

    假设您不想在程序中指向由“ex2 数据类型”构成的对象,我认为删除目标属性可能会提高程序的速度,因为编译器可以显着优化 ex2 的内部结构将在运行时对其进行无别名假设。当用作子例程的参数时,关于 intent() 的参数也相同。

    但是,对于简单的“type ex1”,当我不想在程序中指向它时,我真的不在乎是否保留它是否带有目标属性。

    【讨论】:

      猜你喜欢
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多