如何在Haskell Control.Parallel.Strategies中制定策略?

时间:2010-09-09 19:05:32

标签: haskell parallel-processing

更新:我刚刚找到this documentation page。希望the documentation that I'd been using有一个链接,它似乎是最终的API文档。但也许这是一个新的,未发布的工作。

更新2 :本文档让我更好地了解了如何使用Control.Parallel.Strategies模块。但是我还没有完全解决问题......看到问题的结尾。

我一直在尝试在Haskell中使用parListChunk或其他一些并行控制功能。但我无法弄清楚如何使用它们。警告:我是Haskell noob。大约20年前,我学习了一些关于函数式编程的东西(!)。

这是我的非并行化功能:

possibKs n r = [ (k, (hanoiRCountK n k r)) | k <- [1 .. n-1] ]

我想将它并行化,就像这种天真的尝试:

possibKs n r 
    | n < parCutoff  = results
    | otherwise      = parListChunk parChunkSize results
    where results = [ (k, (hanoiRCountK n k r)) | k <- [1 .. n-1] ]

但是这个结构不适合parListChunk。 文档说:

parListChunk :: Int -> Strategy a -> Strategy [a]
  

parListChunk依次应用a   策略的块(子序列)   并行列表。有用增加   粒度

好,这就是我想要的。但是怎么用呢?我还没有找到任何这方面的例子。如果我理解类型声明,parListChunk是一个带IntStrategy<a>的函数(借用C ++参数化类型表示法来帮助检查我是否真的理解这一点),并返回一个{ {1}}。在我的情况下,我正在为Strategy<[a]>处理Int,因此parListChunk需要一个a参数和一个Int。那么Strategy<Int>是什么?我如何制作一个?一旦我成功使用了parListChunk,我该如何处理它吐出的Strategy

这样Strategy type is defined

Strategy

(这是所有策略的文档。) 所以type Strategy a = a -> Done 是一个函数,它接受Int类型的参数并返回Done。显然它会导致其论证在某个时间或某个时间得到评估。我从哪里得到一个,我应该使用哪种?

以下功能似乎会返回策略:

Strategy<Int>

但是它们都不允许您确定类型参数 - 当您提供参数sPar :: a -> Strategy b sSeq :: a -> Strategy b r0 :: Strategy a rwhnf :: Strategy a 时它们会生成Strategy<b>,否则您无法提供参数a!那是怎么回事??除此之外,我不知道这些意味着什么。

我确实在SO上找到了类似函数parList being used的一个示例:

a

它使用这个时髦的return . maximum $ map optimize xs `using` parList 函数,声明为:

using

足够公平......在我的情况下,我可能希望using :: a -> Strategy a -> a a,因此它需要一个Ints列表和一个[Int]并且(做了什么?将策略应用于列表?和)返回Ints列表。所以我尝试按照parList示例将Strategy<[Int]>后卫更改为:

otherwise
但是我必须承认我还在黑暗中拍摄......我不能完全遵循周围的类型签名。所以上面给出错误并不太令人惊讶:

| otherwise      = results `using` parListChunk parChunkSize

有人可以告诉我使用parListChunk的Couldn't match expected type `[(Int, Integer)]' against inferred type `a -> Eval a' Probable cause: `parListChunk' is applied to too few arguments In the second argument of `using', namely `parListChunk parChunkSize' In the expression: results `using` parListChunk parChunkSize 参数吗?以及如何使用parListChunk返回的Strategy a

新篇

关注Basic Strategies,我认为我需要使用Strategy [a]策略。大概。所以我试试

rseq

但是GHC说rseq“不在范围内”。 These API docs说包中没有rseq,但sSeq似乎已经取代了它。好的,所以我使用了sSeq,但它也“不在范围内”。即使我正在导入| otherwise = results `using` (parListChunk parChunkSize rseq)

任何线索?顺便说一下,我以前收到有关加载包的消息:

Control.Parallel.Strategies

显然,它告诉我有哪个版本的并行软件包:2.2.0.1。但我没有在API docs中看到有关那里描述的版本的信息。如果我不使用rseq或sSeq,我应该使用什么?为什么Edward能够使用parList?

1 个答案:

答案 0 :(得分:2)

好的,我的代码正常运行。我使用rwhnf而不是rseq来编译它:

| otherwise      = results `using` (parListChunk parChunkSize rwhnf)

根据this source coderwhnf在版本3中被重命名为rseq。所以我猜我的版本的Parallel包已经过时了this documentation。 :-S

我猜这是使用“实验性”套餐的价格的一部分。

无论如何,代码编译并运行。它是否对并行性做任何有用的事情是另一个问题......