11

我有几个数字运算操作占 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

所以,我想知道是否有一些规则可以遵循关于何时应该内联函数以提高性能。REPA 作者建议:

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

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

请注意这篇文章:有什么理由不对函数使用 INLINABLE 杂注吗?没有直接解决程序员提供的提示是否真正帮助编译器优化代码的问题。

4

0 回答 0