Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Haskell Control.Parallel.Strategies中制定策略?_Haskell_Parallel Processing - Fatal编程技术网

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

如何在Haskell Control.Parallel.Strategies中制定策略?,haskell,parallel-processing,Haskell,Parallel Processing,更新:我刚找到。希望有一个链接到它从,这似乎是最终的API文件。但也许这是一部新的未出版的作品 更新2:本文档为我提供了如何使用Control.Parallel.Strategies模块的更好想法。但是我还没有完全解决这个问题。。。见问题的结尾 我一直在尝试在Haskell中使用或其他一些并行控制特性。但我不知道如何使用它们。警告:我是哈斯克尔·努伯。大约20年前,我通过Scheme学习了一些函数式编程的知识(!) 这是我的非并行函数: possibKs n r = [ (k, (hanoiRC

更新:我刚找到。希望有一个链接到它从,这似乎是最终的API文件。但也许这是一部新的未出版的作品

更新2:本文档为我提供了如何使用Control.Parallel.Strategies模块的更好想法。但是我还没有完全解决这个问题。。。见问题的结尾

我一直在尝试在Haskell中使用或其他一些并行控制特性。但我不知道如何使用它们。警告:我是哈斯克尔·努伯。大约20年前,我通过Scheme学习了一些函数式编程的知识(!)

这是我的非并行函数:

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)