Haskell 通过并发提高仿真性能

Haskell 通过并发提高仿真性能,haskell,random,concurrency,simulation,Haskell,Random,Concurrency,Simulation,在包含双精度集的数据结构(为简单起见,称之为列表)上考虑此顺序过程。只要我愿意,就做: 从结构中随机选择两个不同的列表 根据这些列表计算统计数据 根据这个统计数字掷硬币 可能会根据掷硬币的结果修改其中一个列表 目标是最终实现收敛,因此“解决方案”在迭代次数上是线性的。在SO问题中可以看到该程序的实施,这是一个直观的可视化: 通过使用多个工作线程在单独的OS线程上并发执行,似乎可以更好地执行此过程,也就是说,可以更快地实现收敛,例如: 我想一个完美实现的实现应该能够在O(n/p)时间内实现一个

在包含
双精度集的数据结构(为简单起见,称之为列表)上考虑此顺序过程。只要我愿意,就做:

  • 从结构中随机选择两个不同的列表
  • 根据这些列表计算统计数据
  • 根据这个统计数字掷硬币
  • 可能会根据掷硬币的结果修改其中一个列表
  • 目标是最终实现收敛,因此“解决方案”在迭代次数上是线性的。在SO问题中可以看到该程序的实施,这是一个直观的可视化:

    通过使用多个工作线程在单独的OS线程上并发执行,似乎可以更好地执行此过程,也就是说,可以更快地实现收敛,例如:

    我想一个完美实现的实现应该能够在O(n/p)时间内实现一个解决方案,对于p,可用计算资源的数量

    阅读Haskell并发让我头晕目眩的术语有
    MVar
    TVar
    TChan
    acid state
    ,等等。很明显,这个过程的并发实现看起来与其他过程非常不同。但是,这个过程本身看起来本质上是一个非常简单的算法,基本上是一个内存中的数据库,这是一个我相信以前有人遇到过的问题

    我猜我将不得不使用某种可变的、并发的数据结构来支持适当的随机访问(即对随机空闲元素的访问)和修改。为了提高性能,当我试图拼凑这可能需要的所有东西时,我有点不知所措(例如,STM似乎有点可疑)

    如果目标是在顺序实现的基础上提高性能,那么哪些数据结构、并发概念等适合此类任务?

    保持简单:

    • 用于轻巧、超便宜的螺纹
    • ,用于快速、线程安全的共享内存
    • 以及适当的序列类型(可能,如果您只预先结束,可能会列出)
    • 好包裹
    • 和快速随机数源(例如-random-pure64)
    你可以稍后再试试更高级的东西。对于原始性能,首先要保持简单:减少锁的数量(例如,每个缓冲区一个锁);确保编译您的代码并使用线程运行时(
    ghc-O2
    ),您应该有一个很好的开始


    RWH有一章介绍并发Haskell的情况。

    感谢推送;诚然,有了所有的“爱好者”材料,我一直在某种程度上避免我认为并发性的基础。当我得到一个令人满意的实现时,我可能会更新这个问题。我最终使用了
    STM
    ,这比
    MVars
    更轻松。下面是一些代码的快照:。除非我使用大量(不必要的)迭代,否则它不会超过我的顺序实现,但我惊讶于它实现起来有多么容易。