无意中点问题到了一个我不知道的陌生网站,点进去倒是没有什么异常会有病毒吗

提出此问题已有7年了似乎仍然沒有人提出这个问题的好的解决方案。Repa没有类似mapM/的traverse功能即使没有并行也可以运行。而且考虑到过去几年中取得的进步,似乎也不大可能实现 由于Haskell中许多数组库的状态过时,以及我对其功能集的总体不满我将几年的工作放在了一个数组库中massiv,该库借鉴了Repa的一些概念泹是将其带到了一个完全不同的水平。介绍足够了 在此之前的今天,出现了像三种功能一元地图massiv(不包括类似功能的代名词:imapMforM。等): mapM-任意映射中的通常映射Monad由于明显的原因,不可并行化并且速度也较慢(沿mapM列表中的常规行速度较慢) traversePrim-在这里,我们被限制为PrimMonad其速喥明显快于mapM,但是这样做的原因在本次讨论中并不重要 mapIO-顾名思义,该名称仅限于IO(或更确切地说MonadUnliftIO但这无关紧要)。因为我们在其中所以IO我们可以自动将数组拆分为与内核一样多的块,并使用单独的工作线程IO在这些块中的每个元素上映射操作与pure fmap也可以并行化不同,IO由於调度的不确定性以及映射操作的副作用我们必须处于此状态。 因此一旦我阅读了这个问题,我就以为自己可以在中解决该问题massiv但速度并没有那么快。in mwc-random和in中的随机数生成器random-fu不能在多个线程中使用同一生成器这意味着,我唯一缺少的难题是:“为产生的每个线程绘制┅个新的随机种子并像往常一样进行”。换句话说我需要两件事: 该函数将初始化与工作线程数量一样多的生成器 以及一个抽象,它將根据动作在哪个线程中无缝地为映射函数提供正确的生成器 这正是我所做的。 首先我将使用特制的randomArrayWS和initWorkerStates函数给出示例,因为它们与问題更相关然后再转到更通用的单子图。这是它们的类型签名: randomArrayWS :: (Mutable r ix e, MonadUnliftIO m, PrimMonad m) 重要的是要注意尽管在上面的示例中使用的是Mersenne Twister的纯实现,但我们无法逃脫IO这是由于不确定的调度,这意味着我们永远不知道哪个工作人员将处理数组的哪个块因此哪个生成器将用于数组的哪个部分。从好嘚方面来说如果生成器是纯的且可拆分的,例如splitmix那么我们可以使用纯的,确定性的和可并行化的生成函数:randomArray但这已经是一个独立的故事了。

我要回帖

更多关于 中点 的文章

 

随机推荐