3

knuthBendix を大量の書き換えルールに適用しようとしています。したがって、私はそれを異なるセットで並行して機能させようとしています。

例として、私は実行しようとします:

import Control.Parallel
import Control.Parallel.Strategies
import Math.Algebra.Group.StringRewriting

knuthBendixOptimized rs = as' `par` bs' `pseq` as' ++ bs' where
    (as, bs) = splitAt 3000 rs
    as' = knuthBendix as
    bs' = knuthBendix bs

を使用してコンパイルしghc -threaded、経由で実行し+RTS -Nます。他のアルゴリズムを並行して実行すると、機能します。しかし、knuthBendix の場合はそうではありません。

誰かが解決策を知っていますか?

ありがとう、フランツ

4

2 に答える 2

5

問題は、あなたが電話をかけていることだと思いますas' `pseq`。これは WHNF に評価さas'れます。これは、リストが空かどうかのみを判断することを意味します。ただし、リストを完全に評価する必要があります。

import Control.Parallel.Strategies    

forceList :: [a] -> [a]
forceList = withStrategy (evalList rseq)
-- or use rdeepseq to force the evaluation of everything

knuthBendixOptimized rs =        forceList as'
                          `par`  forceList bs'
                          `pseq` as' ++ bs'
  where
    (as, bs) = splitAt 3000 rs
    as' = knuthBendix as
    bs' = knuthBendix bs

これに対する Haskell の通常の用語はparallelismであることに注意してください。また、並行性IOは、スレッドとその通信での明示的な作業に使用されます。GHC のマニュアルを参照してください。

于 2013-07-15T18:05:16.763 に答える