gpt4 book ai didi

haskell - Repa 中的嵌套并行性

转载 作者:行者123 更新时间:2023-12-02 14:26:58 25 4
gpt4 key购买 nike

以下代码会产生(可怕的)“嵌套并行性”错误 repa-3.4.0.1 :

import Control.Monad.Identity (runIdentity, liftM)
import Data.Array.Repa as R
import Data.Array.Repa.Repr.Unboxed
import Data.Vector.Unboxed
import Test.Framework
import Test.Framework.Providers.QuickCheck2
import Test.QuickCheck hiding (generate,output)

main :: IO ()
main = defaultMainWithArgs [prop,prop] ["--maximum-generated-tests=1"]

prop = testProperty "Test" $ property prop_fmap

prop_fmap :: Arr Int -> Bool
prop_fmap x = fmapT id x == x




newtype Arr r = Arr (Array U DIM1 r) deriving (Eq, Show)

instance (Arbitrary r, Unbox r) => Arbitrary (Arr r) where
arbitrary = replM arbitrary
shrink = shrinkNothing

replM :: (Unbox r, Monad mon) => mon r -> mon (Arr r)
replM = let n = 6
in liftM (Arr . fromUnboxed (Z:.n)) . replicateM n

fmapT :: (Unbox a, Unbox b) => (a -> b) -> Arr a -> Arr b
fmapT f (Arr v) = Arr $ force' $ R.map f $ v

force' :: (Shape sh, Unbox r) => Array D sh r -> Array U sh r
force' = runIdentity . computeP

确切的错误是:

Performing nested parallel computation sequentially.   You've probably
called the 'compute' or 'copy' function while another instance was
already running. This can happen if the second version was suspended
due to lazy evaluation. Use 'deepSeqArray' to ensure that each array
is fully evaluated before you 'compute' the next one.

我使用 ghc Main -threaded 进行编译,并使用 Main +RTS -N2 运行。我尝试在 fmapT 的定义中使用 deepSeqArray,但没有帮助。由于测试是独立的(除了对随机性进行排序之外),因此尚不清楚在此示例中嵌套并行性如何可能。

有趣的是,如果我将 main 更改为 quickCheck prop_fmap,它会成功完成 100 次测试。因此,测试框架似乎存在与 QuickCheck 不同的问题(可能是 monad 排序的更普遍问题)。

关于为什么我会收到此错误以及如何在仍然进行并行计算的同时避免它,有什么想法吗?

注意:使用Identity monad:ref1 , ref2

最佳答案

问题在于 test-framework 是隐式多线程的(例如,请参阅 this。)

对我有用的解决方案是使用选项 --threads=1 运行 defaultMainWithArgs

关于haskell - Repa 中的嵌套并行性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32981990/

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