哪个haskell数组实现使用? AKA各有利弊

时间:2011-03-04 16:16:56

标签: arrays haskell multicore vectorization

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

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

我看到了什么?

  • haskell-platform中的数组包。这是幸运的,可以并行
  • Data.Vector。有循环融合,但不是在平台上,所以它的成熟度对我来说是未知的。
  • 遣送包,由DPH团队提供,但今天对于任何稳定的ghc 都无效。
  • 对阵列实现的支持级别有很多变化。例如,there doesn't seem是将2D矢量转储到图像文件的简单方法。 IOW,haskell社区显然还没有确定阵列实现。

所以请帮助我选择。

编辑 A = B + C指的是元素明智的添加,而不是列表连接

3 个答案:

答案 0 :(得分:8)

正确,社区尚未确定良好的阵列实施。我认为提交Vector API并删除Data.Array是一个很好的Haskell Prime提交。

矢量非常成熟!它有:

  • VERY easy parallelization
  • 支持mapfilter
  • 有效地执行基于数组的计算,例如A = B + C(但我不熟悉matlab的工作方式)
  • 通过Vector.Storable
  • 从指针创建矢量

它没有:

  • 得到了其他图书馆的足够支持。 IE,绑定到流行的C数学包
  • 支持矩阵,但你可以有矢量矢量。如果你构建一些基于矢量的矩阵运算,那么也许你可以上传到hackage作为矢量矩阵。
  • 生成SIMD代码。

注意:您可以将字节串转换为任意的向量,因此如果您将图像作为字节串,则通过Vector.Storable,您可以将图像作为向量执行所需的操作。

答案 1 :(得分:3)

(我不允许发表评论)

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

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

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

答案 2 :(得分:2)

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

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

至于导出为图像格式,大多数haskell图像库似乎都使用ByteStrings。您可以转换为ByteString,也可以绑定到执行所需操作的C库。如果您发现Haskell库可以满足您的需求,那么将hmatrix数据转换为正确的格式应该很容易。