循环和递归展开

时间:2012-11-30 12:21:47

标签: optimization haskell ghc template-haskell

W_t = M_t[i] if 0 <= t <= 15
W_t = ROTL_1(W_(t-3) XOR W_(t-8) XOR W_(t-14) XOR W_(t-16)) if 16 <= t <= 79

这是SHA-1标准。在haskell中你要做的就是写一个递归函数来做这件事,但为了使它更有效率,我想展开整个递归。内联将不起作用,因为这可能导致代码的指数爆炸。我想到的是写TH来生成常量行W_0W_1W_2等等,直到W_79

另一个例子是在案例中循环展开

For t=0 to 79:
{
    T = ROTL_5(a) + f_t(b, c, d ) + e + K_t + W_t
    e = d
    d = c
    c = ROTL_30(b)
    b = a
    a = T
}

我想展开这个循环以避免递归函数调用(我不认为ghc会执行这种优化)。

所以在我为此写下TH之前,我想问一下是否有更好的方法可以做到这一点。只是说优化在这里非常关键。

1 个答案:

答案 0 :(得分:2)

TH是执行user-controlled loop unrolling的“标准”方式。