Параллельная карта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 параллелизм - очень сложный компромисс.

Ответы на вопрос(1)

Ваш ответ на вопрос