我想问一些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)
.......
--------------------------
我无法找到摆脱复制的方法,这肯定会减慢我的代码速度。我在想,有谁知道为什么会这样,我该如何解决?
答案 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
数组的适当部分的引用,因为列在内存中是连续排序的。