消除Fortran中的隐藏副本

时间:2015-11-13 14:04:59

标签: fortran

我想问一些Fortran大师关于我在Cray编译器的最新版本中遇到的问题。我有几个警告,虽然它们不会影响正确性,但它们可能会对性能有所帮助。警告是:

  

此参数会生成临时变量的副本。

以下是我收到此警告的情况之一。在同一个文件(fem.f90)和模块中:

  call fem( array_local( i, : ), pcor, arcol, inder,    & 
                              ^ 
  ftn-1438 crayftn: CAUTION FFEM, File = fem.f90, Line = 676, Column = 31 
  This argument produces a copy in to a temporary variable. 

调用array_local的例程FFEM如下所示:

-------------------------- 
subroutine ffem( alow, pcor, arcol, inder,  iflag ) 

  integer , intent( in ) :: alow(3), pcor(3) 
  real, intent( in ) :: inder,arcol 
  integer, intent( out ) :: iflag 

  integer::  array_local(5,3) 

 ! within in a loop 
  call fem( array_local( i, : ),  pcor, arcol, inder,    & 
   .......... 
-------------------------- 

这是fem子程序:

-------------------------- 
subroutine fem (ac,  pc, rc, id, flag ) 
 integer, intent( in ) :: ac(3) 
       ....... 
-------------------------- 

我无法找到摆脱复制的方法,这肯定会减慢我的代码速度。我在想,有谁知道为什么会这样,我该如何解决?

2 个答案:

答案 0 :(得分:4)

如果array_local必须按原样定义,并且您无法像brady节目那样将其定义为(5,3),则可以考虑假设的形状伪参数

subroutine fem (ac,  pc, rc, id, flag ) 
 integer, intent( in ) :: ac(:) 

传递的数组可以是非连续的,但仍然没有副本,ac也将是非连续的(跨步)。

您需要明确的接口。最好通过将子程序放在模块中来实现。

答案 1 :(得分:2)

此更改的可行性取决于您在其他地方使用array_local,但您可以交换订单:

integer:: array_local(3,5)

然后拨打fem

call fem( array_local( :, i ), pcor, arcol, inder, &

这将允许编译器简单地发送对array_local数组的适当部分的引用,因为列在内存中是连续排序的。