Data Parallel Haskell 中的 PArray 和 [::] 有啥区别?

Posted

技术标签:

【中文标题】Data Parallel Haskell 中的 PArray 和 [::] 有啥区别?【英文标题】:What is the difference between PArray and [::] in Data Parallel Haskell?Data Parallel Haskell 中的 PArray 和 [::] 有什么区别? 【发布时间】:2012-06-19 14:57:17 【问题描述】:

我一直在对 Data Parallel Haskell 进行大量研究,发现了两种单独的并行数组类型。 [::] 类型似乎更多地出现在研究论文中,似乎是理想的类型,但PArray 似乎无处不在。关于该主题的 wiki 页面清楚地表明,[::] 类型的数组不能传递给未矢量化的代码。为什么?为什么会有这个中间的PArray 类型?这对我来说似乎完全是多余的。 wiki 称其为“平面数组”,但矢量化的全部意义在于使并行数组平面化。

更新:在阅读了更多的论文、文档和源代码之后,我更加困惑了。 [::] 或其同义词PArr 似乎在GHC.PArr 中实现为平面数组,而PArray,在多个地方称为“平面”的中间类型,在Data.Array.Parallel.PArray.Base 和其他导入的模块中实现从那里作为一个数据家族,使用我读过的许多论文中描述的扁平化转换。为什么扁平数组不扁平而嵌套数组扁平?

更新2:经过更多研究,我发现文档完全是一团糟。维基页面hasn't had any content updates 近一年,与hackage 文档相矛盾(参见Data.Array.Parallel.Prelude,其中明确表示不要导入特殊前奏),并且通常已经过时。 GHC Trac page 也已过时,例如,包括 DPH 软件包指南,其中提到了至少就 Hackage 而言的软件包(我没有,也不完全没有地方可以查看)其他地方),不存在,也没有提到像 dph-lifted-vseg 这样的包。

更好的一点是,我相信我现在理解了第一次更新的答案,GHC.PArr 中的这部分 cmets 暗示了:

-- BIG UGLY HACK: The desugarer special cases this module.  Despite the uses of '-XParallelArrays',
--                the desugarer does not load 'Data.Array.Parallel' into its global state. (Hence,
--                the present module may not use any other piece of '-XParallelArray' syntax.)
--
--                This will be cleaned up when we change the internal represention of '[::]' to not
--                rely on a wired-in type constructor.

我的猜测是,启用矢量化后,该模块会自动替换为使用扁平化转换的另一种表示形式。这甚至可能类似于

type [::] = PArray

,解决了我原来的问题。然而,后一点不仅没有多大意义(为什么在矢量化关闭时将[::] 限制为平面数组类型?),而且除了上述评论之外,我没有发现任何证据支持这两种理论。似乎学习任何东西的唯一可靠方法是查看 GHC 源,考虑到它的大小和复杂性,这是我渴望做的事情,即使我确信我会成功。

【问题讨论】:

【参考方案1】:

参考这个:

http://hackage.haskell.org/packages/archive/dph-seq/0.5.1.1/doc/html/Data-Array-Parallel.html

【讨论】:

最好将链接中有趣的部分包含在您的答案中 你是说PArray对应的是“惰性数组”,而[::]对应的是“严格数组”?

以上是关于Data Parallel Haskell 中的 PArray 和 [::] 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Haskell 中的并行“任何”或“全部”

Haskell 中的打印机用于 Data.Comp.Variables 中的 Subst

Algebraic Data Type 及其在 Haskell 和 Scala 中的表现

Haskell - parMap有什么用?

翻译/编码 Haskell 的 `data Obj = forall a. (显示 a)=> Scala 中的 Obj a`

Haskell中不同类型之间的关系