数据并行Haskell中PArray和[::]之间有什么区别?

时间:2012-06-19 14:57:18

标签: haskell data-parallel-haskell

我一直在对Data Parallel Haskell进行大量研究,发现了两种单独的并行数组类型。 [::]类型似乎在研究论文中显得更多,似乎是理想类型,但PArray似乎无处不在。关于该主题的Wiki页面清楚地表明,类型[::]的数组不能传递给非计算代码。为什么?为什么有这种中间PArray类型?这对我来说似乎完全是多余的。维基称之为“平面阵列”,但矢量化的重点是使平行阵列平坦。

更新:在阅读了更多论文和文档以及源代码后,我更加困惑。 [::]或其同义词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中的这部分评论暗示:

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