如何编写Haskell数组策略

5

我想编写一个并行评估数组中项目的策略。旧的策略使用parArr实现此功能(请参见此处)。但是,在新的Control.Parallel.Strategies模块中找不到它。

例如,对列表进行并行评估:map f myList `using` parList rdeepseq

我希望能够做类似这样的事情:amap f myArr `using` parArr rdeepseq,其中amap来自Data.Array.Base,并对每个元素应用一个函数(按顺序)。

以下内容似乎有效,但我想知道它是否正确,并想知道如何定义自己的parArr

这个有效:amap ((+1) `using` rpar) $ Array.array (0,4) [(0,10),(1,20),(2,30),(3,40),(4,50)]


3
你确定这个方法有效吗?因为“(+1) using rpar”很奇怪。它会并行地计算表达式“(+1)”,这没有太多意义,因为“(+1)”是一个 lambda 表达式,已经在 WHNF 中,没有剩余的待求值部分。你可能想要使用“amap ((using rpar).(+1))”吧? - Rotsor
4
为什么不使用已经具有并行策略且通常更加灵活的repavector呢? - Don Stewart
@Rotsor:感谢你指出这一点。你说的很有道理。+1@Don Stewart:repavector肯定更灵活,但我正在尝试通过使用策略来限制对现有代码库的更改,从而引入并行性。使用策略,我可以在算法和并行行为之间有良好的分离。如果它有效,下一步将是查看您的建议。谢谢 +1 - vis
2个回答

4

关于之前的问题, 我为向量包写了一个并行评估策略。这是一个很好的开始。您可以在hackage上查看代码,在vector-strategies包中。

我没有时间给出完整的答案 - 也许稍后我会编辑。欢迎评论提出更多问题和方向。


这给了我一个关于编写策略的好主意。还有一个链接到 Github,展示了如何在普通数组上使用 parTraversable。在我的情况下,这应该会给出我期望的行为。 - vis

2
除了给出的所有好建议之外:没有parArr的原因很简单,它已被更通用的parTraversable取代。只需说:
amap f myArr `using` parTraversable rdeepseq

那应该能给您所要求的行为。

谢谢Peter,让我意识到parTraversable正好可以完成我期望parArr完成的工作。+1 - vis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接