【问题标题】:Do pointers inhibit compiler optimizations?指针会抑制编译器优化吗?
【发布时间】:2017-04-24 08:42:15
【问题描述】:

我试图将数组传递给子程序,在子程序中声明为假定的形状数组。这给了我一些我可以通过传递指针来解决的问题。

但是一些声誉很高的用户在评论中告诉我:

添加指针也是告诉编译器优化器它今天不需要做任何工作的合理方式。

谁能提供一个简短的解释?语言是 Fortran 95,尽管我相信这适用于其他语言。

【问题讨论】:

  • 我认为 OP 指的是this comment
  • 确实如此。对于 SIMD,无论该点是否按顺序索引,都很难保证数据是连续的。 Fortran 可能比大多数语言更正确,因为许多 Fortran 专门针对向量/数组。但是编译器的胆量通常都接近渐近线,在该渐近线中,fortran 和 c 之间的程序集几乎相同。通常意味着某些事情,更难的代码需要更多的工作。
  • @4castle 我故意没有包含指向原始评论的链接,因为它包含误导性信息:(通过使用指针)“您不再能够传递数组部分”,这是错误的.在将数组部分作为参数传递给子例程之前,没有什么比将指针分配给数组部分更容易的了。

标签: performance pointers fortran compiler-optimization


【解决方案1】:

是的,Fortran 编译器必须假定指针可以与其他指针和target 变量别名。

如果你有指针数组ab 然后在

  a(i) = a(i) + b(i)

编译器必须假定这两个数组可能部分重叠,并且它必须禁止某些优化,因为更改 a 的值可能会在某个未知索引处更改 b 的某些值。

另请参阅 C restrict 关键字和 Is Fortran easier to optimize than C for heavy calculations? 的更彻底的讨论。不值得重复那里提出的关于指针别名的所有观点。

IanH 的评论可能是故意有点过于强烈,但其中有很多道理。

【讨论】:

    猜你喜欢
    • 2013-05-24
    • 2012-11-04
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    相关资源
    最近更新 更多