gpt4 book ai didi

performance - 如何在 Haskell 中优化数值库的速度

转载 作者:行者123 更新时间:2023-12-03 16:54:19 25 4
gpt4 key购买 nike

我发布了一个用于求解延迟微分方程的小型数值库:http://github.com/masterdezign/dde

主要技术限制:

  • 使库在动态变量(x(t),y(t),...)的数量方面具有灵活性,即 State给定时刻的动力系统。
  • 与利用 Data.Vector.Storable 的库(例如 hmatrix)轻松集成。因此,作为输入/输出,我广泛使用 Data.Vector.Storable。

  • 因此,与此解决方案不同的是:
    How do I optimize numerical integration performance in Haskell (with example) ,
    newtype State = State { _state :: V.Vector Double }用来
    而不是 data State = State {-# UNPACK #-} !Double {-# UNPACK #-} !Double .但是,该库现在运行速度慢了两倍。

    问题:有什么办法可以同时带来 data State = State {-# UNPACK #-}...的速度以及 newtype State = State { _state :: V.Vector Double } 的灵活性对于未指定数量的变量?我是否应该考虑创建模板 Haskell data UNPACK - 编译期间的结构?

    最佳答案

    我不会使用任何特定的向量实现。可变长度类型,如 Data.Vector是一个糟糕的选择,不仅因为当空间维度低时额外的长度信息是一个相当大的开销,还因为你失去了任何类型系统保证维度匹配。

    相反,您应该在向量空间的选择上使一切参数化。即,您有效地使维度成为编译时变量,并且您允许具有一些有意义命名的子变量的向量类型。

    import Data.VectorSpace
    import Data.AdditiveGroup

    newtype Stepper1 state = Stepper1 {
    _stepper
    :: Double
    -> RHS state -- parameterised in a similar way
    -> state
    -> (Double, Double)
    -> (Double, Double)
    -> state
    }

    rk₄ :: VectorSpace v => Stepper1 v
    rk₄ = Stepper1 _rk4
    where _rk4 hStep rhs' y₀ ... = y₀ ^+^ (h/6)*^(k₁ ^+^ 2*^k₂ ^+^ 2*^k₃ ^+^ k₄)
    where k₁ = rhs' (y₀, ...)
    k₂ = rhs' (y₀ ^+^ (h/2)*^k₁, ...)
    k₃ = rhs' (y₀ ^+^ (h/2)*^k₂, ...)
    k₄ = rhs' (y₀ ^+^ h*^k₃, ...)

    然后,用户可以选择具体的实现方式。对于二维向量,标准选择是 V2 来自 linear包裹;它被重新导出 VectorSpace来自 free-vector-spaces 的实例.但是为了测试,你也可以只使用普通的旧元组,它有 VectorSpace实例就在 vector-space .当然,环绕来自 hmatrix 的类型也是可能的,但这对性能确实不利 - 最好在必要时转换最终结果。

    为了获得最佳性能,您可能需要使用一些 {-# INLINE #-}编译指示。 Bang 模式 OTOH 通常不会带来太多的性能优势——最重要的是类型是严格的,并且是未装箱的。在每个变量定义之前先发制人地放置一个 bang 肯定是没有用的——无论如何这些都不会产生任何影响,因为 CAF 只有在使用时才会被评估。

    我很高兴听到你最后的表现!如果它明显比你原来的差 State {-# UNPACK #-} !Double {-# UNPACK #-} !Double ,这是我们应该调查的事情。

    关于performance - 如何在 Haskell 中优化数值库的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49050900/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com