繁体   English   中英

将数组大小作为参数传递给 fortran 中的子例程

[英]Passing size of array as argument to a subroutine in fortran

我想知道在 fortran 中查询数组大小的开销。旧的 fortran (<f95) 方法是将数组的大小传递给子例程的 arguments:

subroutine asub(nelem,ar)
integer,intent(in)::nelem
real*8,intent(in)::ar(:)

! do stuff with nelem such as allocate other arrays

end subroutine asub

由于f95的大小为function,所以可以这样做:

subroutine asub(ar)
real*8,intent(in)::ar(:)

! do stuff with size(ar) such as allocate other arrays

end subroutine asub

如果 asub 被调用一百万次,方法 2 是否性能不佳?

我问是因为我正在处理一个相对较大的代码,其中一些数组大小是全局变量(甚至不作为子例程参数传递),我认为这真的很糟糕。 方法 1 需要大量工作才能将数组大小传播到整个代码,而方法 2 在我的例子中显然更快。

谢谢 !


nelem是需要从memory读取的数, size(ar)也是需要从memory读取的数,查询一次即可。 然后可能对nelem元素进行大量计算。 查询值大小的开销将完全可以忽略不计。

好的, size(ar)是一个 function 调用,但编译器可以插入从数组描述符中读取正确的值)。 即使它仍然是 function 调用,它仍然只会被调用一次。

差异(如果有的话)将在其他地方,主要如 francescalus将 arrays 中的子程序传递给 Fortran 中链接的 Q/A 中所述:假定形状与显式形状 根据编译器可以假设数组在 memory 中是连续的,它将能够更好或更差地优化它(例如 SIMD 矢量化)。

与往常一样,在性能很重要的地方,您应该进行测试和测量。 请记住启用所有相关的编译器优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM