類似this related question,我想在一個Vector執行並行的地圖,但在我來說,我有一個嵌套向量,我似乎無法得到正確的評價。哈斯克爾嵌套向量並行的戰略
這是我到目前爲止有:
import qualified Data.Vector as V
import qualified Data.Vector.Unboxed as U
import Data.Vector.Strategies
import Control.DeepSeq
main = do
let res = genVVec 200 `using` parVector 2
print res
genUVec :: Int -> U.Vector Int
genUVec n = U.map (ack 2) $ U.enumFromN n 75
genVVec :: Int -> V.Vector (U.Vector Int)
genVVec n = V.map genUVec $ V.enumFromN 0 n
ack :: Int -> Int -> Int
ack 0 n = n+1
ack m 0 = ack (m-1) 1
ack m n = ack (m-1) (ack m (n-1))
instance (NFData a, U.Unbox a) => NFData (U.Vector a) where
rnf = rnf . U.toList
給出:
$ ./vectorPar +RTS -N8 -s >/dev/null
SPARKS: 200 (17 converted, 183 pruned)
Total time 1.37s ( 1.30s elapsed)
$ ./vectorPar +RTS -s >/dev/null
SPARKS: 200 (0 converted, 200 pruned)
Total time 1.25s ( 1.26s elapsed)
我也曾嘗試直接修改parVector
功能in vector-strategies,但我的企圖是笨拙而無效的。
我意識到REPA是爲嵌套工作負載設計的,但這似乎是一個足夠簡單的問題,我寧願不必重寫很多代碼。
我希望我能接受這兩個答案(這是長期的答案)。順便說一句:不要感到內疚,我只能希望有一天可以提供像矢量策略(破碎或不破碎!)的東西。 :) – JKnight
@JKnight我已經上傳了vector-strategies-0.2來解決這個問題和一個文檔錯誤。 –
@Thomas M. DuBuisson:至少在這種情況下,我懷疑原始矢量是否構建完成,因爲它是通過'enumFromN'構造的,並且相對較快地轉換爲列表。無論如何,我可以確認你的新版本的作品,並提供比我的解決方案更好的性能。 –