Haskell 并行排列IO操作
我有一个函数,返回一个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' 可以找到完整的文件(
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