haskell - 通过并发提高仿真性能

标签 haskell random concurrency simulation

在包含 Doubles 的集合(为简单起见,称它们为列表)的数据结构上考虑此顺序过程。 .只要我愿意,请执行以下操作:

  • 从结构中随机选择两个不同的列表
  • 根据这些列表计算统计数据
  • 根据该统计数据掷硬币
  • 可能会根据抛硬币的结果修改其中一个列表

  • 目标是最终实现收敛,因此“解决方案”与迭代次数呈线性关系。在 SO 问题 here 中可以看到此过程的实现。 ,这是一个直观的可视化:

    sequential vis

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

    concurrent vis

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

    阅读 Haskell 并发性让我头晕目眩,比如 MVar , TVar , TChan , acid-state等等。似乎很清楚的是,此过程的并发实现看起来与 the one I linked above 大不相同。 .但是,该过程本身似乎本质上是一个非常温和的算法,它本质上是一个内存数据库,我敢肯定有人以前遇到过这个问题。

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

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

    最佳答案

    把事情简单化:

  • forkIO用于轻量级、超便宜的线程。
  • MVar , 用于快速、线程安全的共享内存。
  • 和适当的序列类型(可能是 vector ,如果你只是在前面可能会列出)
  • 不错stats包裹
  • 和一个快速随机数源(例如 mersenne -random-pure64)

  • 你可以稍后尝试更高级的东西。对于原始性能,首先要保持简单:保持锁定的数量(例如每个缓冲区一个);确保编译您的代码并使用线程运行时( ghc -O2 ),您应该有一个良好的开端。

    RWH 有一个介绍章节 cover the basics并发 Haskell。

    关于haskell - 通过并发提高仿真性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10627980/

    相关文章:

    haskell - 无法将预期类型与推断类型匹配,刚性类型变量错误

    haskell - 为什么 MonadIO 是特定于 IO 的,而不是更通用的 MonadTrans?

    java并发,生产者(经纪人)和消费者

    java - 映射方法中的线程安全 "put if greater"

    c++ - 多线程环境下初始化的内存语义(C++)

    haskell - 用 GHC 编译成巨大的二进制文件的小型 Haskell 程序

    haskell - 使用 Haskell 播放 wav 文件

    c++ - C/C++ 中的 rand、urand 和 irand 有什么区别?

    Java生日悖论算法

    c# - 如何生成[0,1]范围内的随机双数?