通过并发提高仿真性能

时间:2012-05-16 23:11:12

标签: haskell random concurrency simulation

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

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

    sequential vis

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

    concurrent vis

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

    阅读Haskell并发性让我的头脑旋转了MVarTVarTChanacid-state等术语。似乎很清楚的是并发实现这个程序看起来与the one I linked above非常不同。但是,程序本身似乎基本上是一个非常温和的算法,基本上是一个内存数据库,这是一个我以前确定有人遇到过的问题。

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

    如果目标是对顺序实现的性能提升,那么哪种数据结构,并发性概念等适用于此类任务?

1 个答案:

答案 0 :(得分:4)

保持简单:

  • forkIO用于轻量级,超便宜的线程。
  • MVar,用于快速,线程安全的共享内存。
  • 和相应的序列类型(可能是vector,如果你只是前缀可能是列表)
  • 一个很好的stats
  • 和快速随机数源(例如mersenne - random-pure64)

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

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