Параллельная картаM на массивах Repa
В моем недавнемРабота сGibbs sampling
Я очень хорошо использовалRVar
что, на мой взгляд, обеспечивает почти идеальный интерфейс для генерации случайных чисел. К сожалению, я не смог использовать Repa из-за невозможности использовать монадические действия на картах.
Хотя ясно, что монадические карты не могут быть распараллелены в целом, мне кажется, чтоRVar
может быть, по меньшей мере, одним примером монады, в которой эффекты могут быть безопасно распараллелены (по крайней мере, в принципе; я не очень хорошо знаком с внутренней работой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
)?
Как это может выглядеть? Какие еще монады могут обитать в этом классе? Рассматривали ли другие возможность того, как это может работать в Repa?
Наконец, если это понятие параллельных монадических действий не может быть обобщено, видит ли кто-нибудь какой-нибудь хороший способ сделать эту работу в конкретном случаеRVar
(где это было бы очень полезно)? СдаватьсяRVar
параллелизм - очень сложный компромисс.