【问题标题】:Is there a memmove/memcpy wrapper for STUArray?STUArray 是否有 memmove/memcpy 包装器?
【发布时间】:2021-04-03 14:50:22
【问题描述】:

我正在将程序从使用 MVector Word32 切换到 STUArray Word Word32。在我的矢量代码中,我使用unsafeMove 来移动矢量切片;认为它可能是为了提高效率而包装了memmove

case dst ⊕ 3 of
  src | n < src + w -> do
    let w0 = n - src
    let w' = w - w0
    unsafeMove (slice dst w0 v) (slice src w0 v)
    if w' <= 3
      then do
        unsafeMove (slice (n - 3) w' v) (slice 0 w' v)
      else do
        let w'' = w' - 3
        unsafeMove (slice (n - 3) 3 v) (slice 0 3 v)
        unsafeMove (slice 0 w'' v) (slice 3 w'' v)
  src | n < dst + w -> do
    let w1 = n - dst
    let w'' = w - w1
    unsafeMove (slice dst w1 v) (slice src w1 v)
    unsafeMove (slice 0 w'' v) (slice 3 w'' v)
  src -> do
    unsafeMove (slice dst w v) (slice src w v)

MArray 类型类似乎没有公开一种在一次调用中移动多个元素的方法,只是一个接一个地移动。是否有用于一次移动多个 STUArray 元素(或者可能是 ByteArray#)的包装器?

【问题讨论】:

    标签: arrays haskell memmove


    【解决方案1】:

    认为它可能是为了提高效率而包装 memmove

    首先我决定为你检查一下这是否真的是真的。

    • unsafeMove 最终归结为为MVector 定义的basicUnsafeCopy 操作,该操作委托给copyMutableArray
    • copyMutableArray's implementation 因 GHC 版本而异。对于旧版本,它只是普通 Haskell 中的一个 IO 循环,但从 7.8 开始,它已委托给 primop copyMutableArray#
    • copyMutableArray#memmovememcopy 的包装器,具体取决于数组是否重叠。

    我搜索了the source of Data.Array,并没有找到对copyMutableArray 的引用。另一种可能性是 Data.Array 为您提供了某种方式来将您的 STUArray 视为 MutableArray,从而您自己调用 copyMutableArray。但我也发现 Data.Array 中没有提到 MutableArray。

    我的初步结论是Data.Array中没有memmove/memcopy包装器。

    【讨论】:

    • 必须深入研究Data.Array.Base 甚至GHC.Arr 才能真正获得执行相当有效的数组操作所需的访问权限并不罕见。除非您确实需要灵活的索引,否则请改用 primitivevector 中的数组。
    • @dfeuer 啊哈,我不知怎的错过了Data.Vector.Unboxed
    • @rampion, vector 很大。我还没有(还)在那里找到模块让您在不需要时选择退出可能昂贵的切片机器。而且混合模式融合机制非常复杂,几乎没有人能理解幕后发生了什么,或者他们需要做什么来确保他们的代码按预期编译。
    猜你喜欢
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 2017-12-11
    • 1970-01-01
    • 2016-06-09
    • 2011-04-17
    相关资源
    最近更新 更多