如何在Haskell Control.Parallel.Strategies中制定策略?
更新:我刚找到。希望有一个链接到它从,这似乎是最终的API文件。但也许这是一部新的未出版的作品 更新2:本文档为我提供了如何使用Control.Parallel.Strategies模块的更好想法。但是我还没有完全解决这个问题。。。见问题的结尾 我一直在尝试在Haskell中使用或其他一些并行控制特性。但我不知道如何使用它们。警告:我是哈斯克尔·努伯。大约20年前,我通过Scheme学习了一些函数式编程的知识(!) 这是我的非并行函数:如何在Haskell Control.Parallel.Strategies中制定策略?,haskell,parallel-processing,Haskell,Parallel Processing,更新:我刚找到。希望有一个链接到它从,这似乎是最终的API文件。但也许这是一部新的未出版的作品 更新2:本文档为我提供了如何使用Control.Parallel.Strategies模块的更好想法。但是我还没有完全解决这个问题。。。见问题的结尾 我一直在尝试在Haskell中使用或其他一些并行控制特性。但我不知道如何使用它们。警告:我是哈斯克尔·努伯。大约20年前,我通过Scheme学习了一些函数式编程的知识(!) 这是我的非并行函数: possibKs n r = [ (k, (hanoiRC
possibKs n r = [ (k, (hanoiRCountK n k r)) | k <- [1 .. n-1] ]
parListChunk按顺序应用
数据块(子序列)的策略
并列的名单。有益于增加
粒度
很好,这就是我想要的。但是如何使用它呢?我还没有找到任何这样的例子。如果我理解类型声明,parListChunk是一个采用Int
和策略的函数,如下所示:
type Strategy a = a -> Done
(这就是战略文件的全部内容。)
因此,策略
是一个函数,它接受Int类型的参数并返回Done。显然,它会导致其论点在某个特定的时间或某物上得到评估。在哪里可以买到,我应该用什么样的
以下功能似乎可以返回策略:
sPar :: a -> Strategy b
sSeq :: a -> Strategy b
r0 :: Strategy a
rwhnf :: Strategy a
但是它们都不允许您确定类型参数——当您给出参数a
时,它们会生成策略,否则您就不能提供参数a
!这是怎么回事??除此之外,我不知道这些是什么意思
我确实在上面找到了一个类似函数的示例:
它使用这个时髦的函数,声明如下:
using :: a -> Strategy a -> a
很公平。。。在我的例子中,我可能希望a
成为[Int]
,因此它获取一个Int列表和一个策略
,并(做些什么?将策略应用于列表?并)返回一个Int列表。因此,我尝试遵循parList示例,并将我的否则
防护更改为:
| otherwise = results `using` parListChunk parChunkSize
但我必须承认我还是在黑暗中拍摄。。。我不能完全理解周围的字体签名。因此,上面给出的错误也就不足为奇了:
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的策略a
参数使用什么吗?如何使用parListChunk返回的策略[a]
新零件
现在来看,我想我需要使用rseq
策略。可能所以我试着
| otherwise = results `using` (parListChunk parChunkSize rseq)
但GHC表示,rseq“不在范围内”。
假设包中没有rseq,但sSeq似乎已经取代了它。好的,我使用了sSeq,但它也“不在范围内”。即使我正在导入Control.Parallel.Strategies
有什么线索吗?顺便说一句,我过去常常收到关于加载软件包的消息:
Loading package deepseq-1.1.0.0 ... linking ... done.
Loading package parallel-2.2.0.1 ... linking ... done.
很明显,这说明了我的并行包的版本:2.2.0.1。但是我没有看到关于这里描述的版本的信息。如果我不应该使用rseq或sSeq,我应该使用什么?为什么我能使用parList?好的,我让代码正常工作了。我使用rwhnf
而不是rseq
来编译它:
| otherwise = results `using` (parListChunk parChunkSize rwhnf)
根据,在第3版中,rwhnf
被重命名为rseq
。所以我想我的并行包版本在以下方面已经过时了:-
我想这是使用“实验性”软件包的部分价格
无论如何,代码编译并运行。另外一个问题是,它是否对并行性有用…请确保使用+RTS-N运行可执行文件以使用多个内核。如果您启用+RTS-s来显示统计信息,您可以看到工作在整个内核中的分布效率。要进行更细粒度的调优,请使用ThreadScope()。谢谢,@John。在WinGCHi中,我在GHCi启动选项中有“ghc——交互式线程化”。我想这还不够?我甚至可以在WinGCHi内部运行多线程程序吗?IIRC ghci始终使用线程运行时(例如,线程是隐式的)。只需在启动选项中指定所需的运行时选项,就可以了。如果不使用-N,默认情况下,即使使用线程化运行时,也将保持在一个核心上。
| otherwise = results `using` (parListChunk parChunkSize rseq)
Loading package deepseq-1.1.0.0 ... linking ... done.
Loading package parallel-2.2.0.1 ... linking ... done.
| otherwise = results `using` (parListChunk parChunkSize rwhnf)