Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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 并行排列IO操作_Haskell_Io_Parallel Processing - Fatal编程技术网

Haskell 并行排列IO操作

Haskell 并行排列IO操作,haskell,io,parallel-processing,Haskell,Io,Parallel Processing,我有一个函数,返回一个IO动作 f :: Int -> IO Int 我想为参数的多个值并行计算这个函数。我的天真实现如下所示: import Control.Parallel.Strategies vals = [1..10] main = do results <- mapM f vals let results' = results `using` parList rseq mapM_ print results' 可以找到完整的文件(

我有一个函数,返回一个IO动作

f :: Int -> IO Int
我想为参数的多个值并行计算这个函数。我的天真实现如下所示:

import Control.Parallel.Strategies

vals = [1..10]
main = do
      results <- mapM f vals
      let results' = results `using` parList rseq
      mapM_ print results'

可以找到完整的文件(有点长,但前几个“euler X”函数应该足够有代表性),我进行并行处理的主文件是。

策略用于纯计算的并行执行。如果您的<代码> f>代码>确实返回了<代码> IO 值,那么请考虑使用<代码> AsYNC/<代码>包。它为并发运行
IO
操作提供了有用的组合器

对于您的用例,
map
看起来很有用:

import Control.Concurrent.Async

vals = [1..10]
main = do
  results <- mapConcurrently f vals
  mapM_ print results
import Control.Concurrent.Async
VAL=[1..10]
main=do

结果尝试
并行io
软件包。它允许您将任何
mapM\uu
更改为
parallel\u

,如果看不到更多,就很难诊断。如果您使用
+RTS-s-N
运行它,那么转换/修剪/失效火花的统计信息是什么?那么
fn
是否返回了一个实际上可以触发的砰砰声?@DanielFischer我在发布完整的文件时有点犹豫,因为它很长(很少有例子)。我认为我的错误在并行代码中,所以我在问题中把重点放在了这一点上。我现在添加了一个新段落,以及
-s
统计数据(非常糟糕)。我不确定实际执行I/O的那些是否会破坏它,但对于纯的那些(不使用
Data.Permute
,因为我没有安装它),我得到了一个加速(以及更多转换的火花)使用
parListChunk
而不是
parList
——即使使用
parListChunk 1
,尽管这会调用
parList
@danielfisher是的,我也注意到分块并行速度更快。无论如何,现在我不仅对如何让我的程序运行得更快感兴趣,而且还对它为什么不能正常工作感兴趣:-)如果你想测试它,我已经在我的文章末尾添加了完整的脚本。如果不是:Async也受到同样的性能影响,但它是一个看起来非常有前途的包,我到目前为止都忽略了它,所以非常感谢!
import Control.Concurrent.Async

vals = [1..10]
main = do
  results <- mapConcurrently f vals
  mapM_ print results