Mapa równoległa na tablicach Repa
W moim ostatnimpraca zGibbs sampling
, Świetnie korzystałem zRVar
który, moim zdaniem, zapewnia niemal idealny interfejs do generowania liczb losowych. Niestety, nie mogłem skorzystać z Repa z powodu niemożności użycia akcji monadycznych na mapach.
Chociaż wyraźnie monadyczne mapy nie mogą być w ogóle zrównoleglone, wydaje mi się, że takRVar
może być co najmniej jednym przykładem monady, w której efekty mogą być bezpiecznie równoległe (przynajmniej w zasadzie; nie jestem zbyt dobrze zaznajomiony z wewnętrznym działaniemRVar
). Mianowicie chcę napisać coś takiego,
drawClass :: Sample -> RVar Class
drawClass = ...
drawClasses :: Array U DIM1 Sample -> RVar (Array U DIM1 Class)
drawClasses samples = A.mapM drawClass samples
gdzieA.mapM
wyglądałby jak coś,
mapM :: ParallelMonad m => (a -> m b) -> Array r sh a -> m (Array r sh b)
Oczywiście, jak to działa, zależy przede wszystkim od wdrożeniaRVar
i jego podstawyRandomSource
, w zasadzie można by pomyśleć, że pociągałoby to za sobą losowanie nowego losowego materiału siewnego dla każdego wątku i kontynuowanie go jak zwykle.
Intuicyjnie wydaje się, że ten sam pomysł może uogólnić na inne monady.
Moje pytanie brzmi: czy można zbudować klasęParallelMonad
monad, dla których efekty mogą być bezpiecznie równoległe (prawdopodobnie zamieszkane przez, co najmniej,RVar
)?
Jak to może wyglądać? Jakie inne monady mogą zamieszkać w tej klasie? Czy inni rozważali możliwość, jak to może działać w Repa?
Wreszcie, jeśli tego pojęcia równoległych działań monadycznych nie można uogólnić, czy ktoś widzi jakiś fajny sposób na wykonanie tej pracy w konkretnym przypadkuRVar
(gdzie byłoby to bardzo przydatne)? Poddawać sięRVar
dla równoległości jest to bardzo trudny kompromis.