【问题标题】:Which haskell array implementation to use? AKA what are the pros and cons of each使用哪个 haskell 数组实现? AKA 各有什么优缺点
【发布时间】:2023-03-18 06:13:02
【问题描述】:

我需要什么? [无序列表]

  • 非常容易并行化
  • 支持地图、过滤器等
  • 能够高效地执行基于数组的计算,例如 A=B+C,有点像 matlab 数组。
  • SIMD 代码的生成。我想这在不久的将来是不可能的,但是嘿,我可以问:)
  • 至少应该支持矩阵,更高维度的优先级较低。
  • 能够获取指向它的指针并从 C 指针创建一个。
  • 来自其他库的支持。 IE,绑定到流行的 C 数学包,i/o 到磁盘或图像(如果数组是 2D)

我看到了什么?

  • haskell 平台中的数组包。这是有福的,可以并行
  • 数据.向量。有循环融合,但没有在平台上,所以它的成熟度对我来说是未知的。
  • repa 包,由 DPH 团队提供,但不能很好地与任何稳定的 ghc今天一起使用。
  • 对阵列实现的支持水平有很多变化。例如,there doesn't seem 是一种将 2D 矢量转储到图像文件的简单方法。 IOW,haskell 社区显然还没有解决数组实现。

所以请帮我选择。

EDIT A=B+C 指的是元素加法,而不是列表连接

【问题讨论】:

  • 等等,您的要求不是要求有序列表吗?除非+union,否则我看不出A=B+C 在无序列表上的意义。
  • @Dan 我想你误会了。对高效A=B+C 的请求指的是数字加法,而不是串联。所以在 Data.Vector 中是 zipWith (+).
  • @TomMD zipWith 通过将第一个列表的元素 1 与第二个列表的元素 1 配对来工作。换句话说,列表中元素的顺序很重要。当列表无序时,这意味着元素的顺序无关紧要,这就是为什么我说A=B+C 在这种情况下是无稽之谈。 (如果有“第一个”元素,它是任意的,因为列表的顺序没有任何意义)
  • @dan 哦,我明白了!您认为他希望数组没有排序。他只提到了“无序列表”,因为他希望向量库的哪些属性没有特定的顺序或偏好。

标签: arrays haskell multicore vectorization


【解决方案1】:

(我不能评论)

rpg:hmatrix 是否接受Data.Vector?它有一个Data.Packed.Vector,但它们是一样的吗?

是的。 hmatrix 的最后一个版本默认使用Data.Vector.Storable 用于一维向量(以前它是可选的)。在 Hackage 中没有显示对 vector 的依赖,可能是因为它在配置标志中。

对于 LAPACK 兼容性矩阵不是 VectorVector t,但它们可以轻松转换(例如:Data.Vector.fromList . toRows)。

【讨论】:

    【解决方案2】:

    正确,社区还没有确定一个好的数组实现。我认为提出 Vector API 并删除 Data.Array 将是一个很好的 Haskell Prime 提交。

    Vector非常成熟!它有:

    • VERY easy parallelization
    • 支持mapfilter
    • 高效地执行基于数组的计算,例如 A=B+C(但我不了解 matlab 的做法)
    • 通过 Vector.Storable 从指针创建向量

    它没有:

    • 有足够的来自其他库的支持。 IE,与流行的 C 数学包的绑定
    • 支持矩阵,但您可以拥有向量的向量。如果您构建一些基于向量的矩阵运算,那么也许您可以作为向量矩阵上传到 hackage。
    • 生成 SIMD 代码。

    注意:您可以将字节串转换为任何向量,因此,如果您将图像作为字节串,那么通过 Vector.Storable,您可以将图像作为矢量做您想做的事情。

    【讨论】:

    • 并行性似乎仅限于盒装向量,因此失去了很多好处。
    • @rpg 是的,我使用paralleldeepseq 工具的明显组合制作了vector-strategies。没有更多研究支持的东西(repa unboxed?),你不可能得到并行的未装箱向量,原语只是不支持这样的工作。
    • repa 仅未装箱。他们甚至在引用它们之前都不检查索引。
    • 你看界面了吗?太可怕了。
    【解决方案3】:

    如果您想要绑定到流行的 C 库,最好的选择可能是 hmatrixblas。 Blas 只是对 BLAS 库的绑定,而 hmatrix 提供了一些更高级别的操作。还有许多基于 hmatrix 构建的库,提供更多功能。如果你正在做任何类型的矩阵工作,这就是我要开始的。

    矢量包也是不错的选择;它稳定并提供出色的性能。 Data.Vector.Storable 类型表示为 C 数组,因此将它们与其他 C 库接口是微不足道的。最大的缺点是没有矩阵支持,所以你必须自己做。

    至于导出为图像格式,大多数 haskell 图像库似乎都使用 ByteStrings。您可以转换为 ByteString,或绑定到您想要的 C 库。如果你找到了一个能满足你需求的 Haskell 库,那么将 hmatrix 数据转换为正确的格式应该很容易。

    【讨论】:

    • hmatrix 是否接受 Data.Vector?它有一个 Data.Packed.Vector 但它们是一样的吗?
    • @rpg 没有hmatrix,它们就不可能相同,这取决于vector,所以没有。如果您单击黑线鳕文档,您可以看到显示其Vectordefinition 的源链接。
    猜你喜欢
    • 2010-09-10
    • 2013-10-13
    • 2012-05-15
    • 2011-03-17
    • 2014-05-11
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    相关资源
    最近更新 更多