Parallel mapM на массивах Repa

В своей недавней работес выборкой Гиббсая широко использовалRVar , который, на мой взгляд, обеспечивает практически идеальный интерфейс для генерации случайных чисел. К сожалению, я не смог использовать Repa из-за невозможности использовать монадические действия на картах.

Хотя очевидно, что монадические отображения вообще не могут быть распараллелены, мне кажется, что RVarможет быть по крайней мере одним примером монады, где эффекты могут быть безопасно распараллелены (по крайней мере, в принципе; I' м не слишком хорошо знаком с внутренней работой RVar). А именно, я хочу написать что-то вроде следующего,

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, в принципе можно было бы подумать, что это будет включать в себя отрисовку нового случайного начального числа для каждого порожденного потока и продолжится как обычно.

Интуитивно кажется, что эта же идея может быть распространена на некоторые другие монады.

Итак, мой вопрос таков: можно ли построить класс ParallelMonadмонад, для которых можно безопасно распараллелить эффекты (предположительно населенные, по крайней мере, RVar)?

Как это может выглядеть? Какие еще монады могут обитать в этом классе? Рассматривали ли другие возможность того, как это может работать в Репе?

Наконец, если это понятие параллельных монадических действий не может быть обобщено, кто-нибудь видит хороший способ заставить это работать в конкретном случае RVar(где это было бы очень полезно)? Отказ от RVarв пользу параллелизма — очень сложный компромисс.

87
задан Paras Joshi 3 May 2013 в 04:38
поделиться