gpt4 book ai didi

haskell - Haskell 中向量的并行映射

转载 作者:行者123 更新时间:2023-12-04 16:08:04 26 4
gpt4 key购买 nike

我想要一个函数,它对向量的作用类似于 parMap rpar 对列表的作用。这是我得到的:

import Data.Vector
import Control.Parallel.Strategies

parMapVec :: (a -> b) -> Vector a -> Vector b
parMapVec f = map (runEval . rpar . f)

我无法完全推断出这会如何或为什么会或不会起作用。

另一种解决方案可能是使 Vector 成为 Traversable 的实例,然后使用 parTraversable,但这似乎需要大量工作才能完成得到类似 parMap rpar 的东西。

最佳答案

Vector 确实是 Taversable 的一个实例,正如 lierdakil 所指出的。我认为这不是因为它没有在 Data.Traversable page. 上列为实例

知道这一点后,我进行了一些测试:

import Control.Parallel.Strategies
import Data.Vector as V
import Data.Maybe

parMapVec :: (a -> b) -> Vector a -> Vector b
parMapVec f v = runEval $ evalTraversable rpar $ V.map f v

range :: Integer -> Integer -> Vector Integer
range x y
| x == y = x `cons` empty
| x < y = x `cons` (range (x + 1) y)
| x > y = (range x (y + 1)) `snoc` y

fac :: Integer -> Integer
fac n
| n < 2 = 1
| otherwise = n * (fac $ n - 1)

main :: IO ()
main = do
let result = runEval $ do
let calc = parMapVec fac $ 80000 `range` 80007
rseq calc
return calc
putStrLn $ show result

我用 ghc --make ParVectorTest.hs -threaded -rtsopts 编译了它并用 ./ParVectorTest -s 运行它并发现了

SPARKS: 8 (7 converted, 0 overflowed, 0 dud, 0 GC'd, 1 fizzled)

INIT time 0.001s ( 0.001s elapsed)
MUT time 5.460s ( 5.447s elapsed)
GC time 15.916s ( 15.893s elapsed)
EXIT time 0.000s ( 0.000s elapsed)
Total time 21.380s ( 21.342s elapsed)

这很好,除了我在我的系统监视器上观察进程执行并看到核心不是同时计算阶乘,而是在计算之间权衡。

这很令人担忧,所以我做了一个测试,其中 main 被修改为以下方式:

main = do
let result = runEval $ do
let calc = parMap rpar fac [80000..80007]
rseq calc
return calc
putStrLn $ show result

我用同样的方式编译运行发现:

SPARKS: 16 (14 converted, 0 overflowed, 0 dud, 1 GC'd, 1 fizzled)

INIT time 0.001s ( 0.001s elapsed)
MUT time 5.412s ( 5.418s elapsed)
GC time 18.583s ( 18.537s elapsed)
EXIT time 0.001s ( 0.000s elapsed)
Total time 23.999s ( 23.957s elapsed)

我不确定为什么有 16 个 Spark 而不是 8 个,但我想这不是重点。该版本还演示了在处理器之间传递计算的相同行为,而不是实际并行执行。

所以,我有一个版本的 parMap rpar 用于向量,速度稍快,尽管使用列表的程序和使用向量的程序都完全并行运行这一事实令人担忧。

编辑:我应该补充一点,我使用原始版本的 parMapVec 运行了相同的测试,但所有的 Spark 都熄灭了,尽管我无法解释原因。

关于haskell - Haskell 中向量的并行映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47915883/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com