Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Fortran中消除隐藏副本_Fortran - Fatal编程技术网

在Fortran中消除隐藏副本

在Fortran中消除隐藏副本,fortran,Fortran,我想问一些Fortran专家关于我在Cray编译器的最新版本中遇到的问题。我有几个警告,虽然它们不会影响正确性,但它们可能会影响性能。警告是: 此参数生成临时变量的副本 以下是我收到此警告的情况之一。在同一文件(fem.f90)和模块中: call fem( array_local( i, : ), pcor, arcol, inder, & ^ ftn-1438 crayftn: CAUTION FFEM,

我想问一些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\u 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) 
       ....... 
-------------------------- 

我无法找到摆脱中的副本的方法,这肯定会降低我的代码速度。我在想,有人知道为什么会发生这种情况吗?我该如何解决

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

integer::array\u local(3,5)

然后调用
fem

调用fem(数组\本地(:,i)、pcor、arcol、inder和


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

此更改的可行性取决于您在其他地方使用
array\u local
,但您可以交换顺序:

integer::array\u local(3,5)

然后调用
fem

调用fem(数组\本地(:,i)、pcor、arcol、inder和


这将允许编译器简单地发送一个引用给<代码> AARYAY本地/<代码>数组的适当部分,因为列在内存中是连续有序的。

如果<代码> AARYAY本地/<代码>必须定义为它,并且不能将其定义为<代码>(5,3)< /代码>,如BrADE所示,可以考虑假想的形状哑元< /P>

subroutine fem (ac,  pc, rc, id, flag ) 
 integer, intent( in ) :: ac(:) 
在那里传递的数组可以是非连续的,但仍然没有副本,
ac
也将是非连续的(跨步)


您需要显式的接口。最好是将子程序放在一个模块中。

< P>如果<代码> ARAYAL本地/代码>必须定义为它,并且不能将其定义为<代码>(5,3)< /代码>,如BrADE所示,可以考虑一个假定的形状哑参数< /P>。
subroutine fem (ac,  pc, rc, id, flag ) 
 integer, intent( in ) :: ac(:) 
在那里传递的数组可以是非连续的,但仍然没有副本,
ac
也将是非连续的(跨步)


您需要显式接口。这最好通过将子例程放置在模块中来实现。

@francescalus我在代码更改方面考虑了更多。也许这也可以通过不同的编译选项来解决,但我需要更改代码才能理解它。
fem()的更改
子例程也可能有帮助。这是一个选项吗?我看不出如何用编译器选项解决这个问题。如果(小)数组临时在堆栈上,可能只会稍微减慢代码速度。
integer,intent(in)::ac(:)
一个显式接口(最好使用模块)是必要的。
array\u local
还有什么用途呢?可能只是使用
array\u local(3,5)
并传递
array\u local(:,i)
就足够了。有关更多信息,请访问OP的交叉帖子@francescalus。我想对代码进行更多的修改。也许这也可以通过不同的编译选项来解决,但我需要修改代码来理解它。
fem()的修改
子例程也可能有帮助。这是一个选项吗?我看不出如何用编译器选项解决这个问题。如果(小)数组临时在堆栈上,可能只会稍微减慢代码速度。
integer,intent(in)::ac(:)
一个显式接口(最好使用模块)是必要的。
array\u local
还有什么用途呢?可能只是使用
array\u local(3,5)
和传递
array\u local(:,i)
就足够了。更多信息,请访问OP的交叉帖子