内联或不内联在Haskell中

时间:2015-04-21 19:39:38

标签: haskell inline number-crunching

我有几个数字运算操作占CPU时间的很大一部分。这种操作的一个例子是这个功能:

import Data.Number.Erf
import Math.Gamma
import Math.GaussianQuadratureIntegration as GQI

-- Kummer's' "1F1" a.k.a M(a,b,z) Confluent Hypergeometric function
-- Approximation by the Gaussian Quadrature method from 128 up to 1024 points of resolution
kummer :: Double -> Double -> Double -> Double -> Double
kummer a b z err = gammaFactor * integralPart
    where
        gammaFactor       = (gamma b) / (gamma a * gamma (b-a))
        integralPart      = (integrator err) fun 0 1
        fun               = (\t -> (e ** (z * t)) * (1-t) ** (b-a-1) * t ** (a-1))
        e                 = exp 1
        integrator err
                | err > 0.1   =  GQI.nIntegrate128
                | err > 0.01  =  GQI.nIntegrate256
                | err > 0.001 =  GQI.nIntegrate512
                | otherwise   = GQI.nIntegrate1024

所以,我想知道当一个函数应该是INLINE以提高性能时是否有一些规则要遵循。 REPA作者建议:

  

将INLINE编译指示添加到代码中的所有叶函数,尤其是那些   计算数字结果。非内联惰性函数调用可能会花费   每个超过50个周期,而每个数字运算符只需一个   (或更少)。内联叶函数也确保它们是专用的   在适当的数字类型。

这些指示是否也适用于其余的数值计算或仅适用于数组计算?或者是否有更一般的指南来决定函数何时应该内联?

请注意,这篇文章:Is there any reason not to use the INLINABLE pragma for a function?并未直接解决程序员提供的提示是否真正有助于编译器优化代码的问题。

0 个答案:

没有答案