我一直在对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的来源,考虑到它的大小和复杂性,这是我渴望做的事情,即使我确信我会成功。
答案 0 :(得分:1)