【问题标题】:Does Fortran intent(inout) pass a copy of the value, or pointer/reference to RAM address?Fortran intent(inout) 是否传递值的副本或指向 RAM 地址的指针/引用?
【发布时间】:2014-12-04 21:06:54
【问题描述】:

正如标题所述,我想知道 Fortran intent(inout) 是否传递了值的副本或指向 RAM 地址的指针/引用?我需要知道这一点的原因是我需要传递一个(相对)大数据矩阵。如果它创建一个会导致我出现问题的本地副本。谢谢!

【问题讨论】:

  • 也许见stackoverflow.com/q/26573059/3157076,特别注意复制/指针不是标准化的。
  • 我什至会去标记为副本。没有理由重复该帖子中的所有内容。至少对我来说。主要信息是,意图是关于假定大小、显式大小、假定形状数组、它们的连续性等的次要想法。

标签: fortran argument-passing subroutine


【解决方案1】:

Fortran 没有详细说明函数和子例程参数如何传递,但它确实要求如果一个过程修改了intent(out)intent(inout) 参数,那么在过程返回后调用者可以看到这些更改。编译器通过引用传递参数来实现这一要求是很常见的,但这不是唯一的可能性——复制输入/复制输出是主要的选择。

您通常可以依靠编译器来实现可以确定是正确的最快行为,这通常是通过引用传递。但是,在某些情况下这不起作用,例如将不连续的数组部分传递给假定大小的虚拟参数,并且有时复制输入/复制输出更快(可能在某些大型多处理器系统上)分段内存架构)。

底线是,尽管您提出了一个很好的问题,但没有一般性的答案。通常情况下,您最好先使其工作,然后在需要时使其更快。将数组复制问题放在脑后,但在您能够测试之前不要太担心。

【讨论】:

  • 您知道任何在作为参数传递时会复制整个数组的 Fortran 实现吗?
  • 不,不具体,但我通常不使用这种行为可能有意义的超级计算机。当我说它可能发生时,我是在借用权威。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
相关资源
最近更新 更多