33

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

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

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

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

-- 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 源,考虑到它的大小和复杂性,这是我渴望做的事情,即使我确信我会成功。

4

1 回答 1

1

参考这个:

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

于 2012-09-06T10:07:57.837 回答