【问题标题】:How to tell that common subexpression elimination is happening or not in GHC?如何判断 GHC 中是否发生了常见的子表达式消除?
【发布时间】:2016-08-29 14:37:31
【问题描述】:

假设我有一个像这样天真的实现的函数:

quadratic a b c = (ans1, ans2)
  where
    ans1 = ((-b) + sqrt (b * b - 4 * a * c)) / (2 * a)
    ans2 = ((-b) - sqrt (b * b - 4 * a * c)) / (2 * a)

有多个相同的子表达式。在不阅读核心的情况下,我如何知道是否正在发生公共子表达式消除以及其中的哪些部分?

【问题讨论】:

  • 我认为“通过阅读核心”是答案。你为什么不想那样做?您可以通过插入来自Debug.Trace 的函数来猜测,但我不会依赖它。
  • @jberryman 是否有经验法则表明哪些代码可能被优化或不可能被优化?
  • 不相关但不确定性是用列表而不是元组建模的。 quadratic a b c = [ans1, ans2] where ...

标签: haskell ghc compiler-optimization


【解决方案1】:

使用trace 可能会告诉您如this SO question 中所示。

import Debug.Trace

quadratic a b c = (ans1, ans2)
  where
    ans1 = ((-b) + tr1 (sqrt (b * b - 4 * a * c))) / (2 * a)
    ans2 = ((-b) - tr2 (sqrt (b * b - 4 * a * c))) / (2 * a)
    tr1 = trace "ans1"
    tr2 = trace "ans2"

main = print $ quadratic 1 10 3

使用-O2-O3 编译它会在跟踪输出中显示ans1ans2,表明GHC 没有执行CSE。你得到类似的 如果您在两个地方都使用tr1,则结果。

Haskell Wiki 提到 GHC 仅在有限的情况下执行 CSE 情况 - (link) - 建议您执行 如果您想确保它发生,请自己动手。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2021-02-11
    • 2018-12-17
    相关资源
    最近更新 更多