2012-06-27 105 views
86

在我最近的workGibbs sampling,我一直在大量使用RVar,在我看來,它提供了一個接近理想的隨機數生成接口。可悲的是,由於無法在地圖中使用monadic動作,我無法使用Repa。雖然明顯的單子地圖一般不能並行化,但在我看來,RVar可能至少是一個monad的例子,其中效果可以安全地並行化(至少在原則上;我並不熟悉RVar的內部工作)。也就是說,我想寫的東西像下面,並行映射M在修復陣列

drawClass :: Sample -> RVar Class 
drawClass = ... 

drawClasses :: Array U DIM1 Sample -> RVar (Array U DIM1 Class) 
drawClasses samples = A.mapM drawClass samples 

其中A.mapM看起來是這樣的,

mapM :: ParallelMonad m => (a -> m b) -> Array r sh a -> m (Array r sh b) 

雖然清楚這是如何工作的關鍵取決於RVar實施及其基礎RandomSource,原則上可以認爲這將涉及爲每個產生的線程繪製一個新的隨機種子,並照常進行。

直觀地看來,這個想法可能會推廣到其他一些單子。

所以,我的問題是:我們可以構造一個monads的類ParallelMonad,其中的效果可以安全地並行化(大概由RVar居住,至少RVar)?

它看起來像什麼?還有什麼其他monad可以居住在這個班級?其他人是否考慮過在Repa中這可能會起作用的可能性?

最後,如果這種並行一元行爲的概念不能一概而論,是否有人看到在RVar的特定情況下進行這項工作的好方法(在那裏它將非常有用)?並行性放棄RVar是非常困難的折衷。

+1

我猜測的關鍵是「爲每個產生的線程繪製一個新的隨機種子」 - 這一步應該如何工作,一旦所有線程返回,種子應該如何重新合併? –

+1

RVar接口幾乎可以肯定需要一些附加功能來適應用特定種子產生新的發生器。無可否認,目前還不清楚這項工作的機制如何,而且確實看起來頗具「RandomSource」特有。我天真地嘗試繪製種子將會做一些簡單的事情,可能會非常錯誤,比如繪製一個元素向量(在'mwc-random'的情況下),並且爲每個元素添加1以便爲第一個工人創建一個種子,如果你需要加密質量的熵,那麼這個數字會非常不足;希望很好,如果你只是需要隨機散步。 – bgamari

+0

我已經能夠做一些類似於你使用'fillChunkedIOP'的要求。 – kosmikus

回答

4

這可能不是一個好主意,因爲PRNG具有固有的連續性。相反,您可能想要按如下方式轉換代碼:

  1. 聲明IO函數(main,或您有什麼)。
  2. 根據需要讀取儘可能多的隨機數。
  3. 將(現在純淨的)號碼傳遞到您的重新設定功能上。
+0

是否有可能在每個並行線程中刻錄每個PRNG以創建統計獨立性? –