【问题标题】:Improving simulation performance via concurrency通过并发提高仿真性能
【发布时间】:2012-05-24 13:45:06
【问题描述】:

在包含Doubles 的集合(为简单起见,称它们为列表)的数据结构上考虑这个顺序过程。只要我愿意,就去做:

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

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

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

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

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

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

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

【问题讨论】:

  • 我最终使用了STM,它比MVars 更不痛苦。一些代码的快照在这里:hpaste.org/69045。除非我使用非常(不必要)大量的迭代,否则它不会胜过我的顺序实现,但我对它的实现如此容易感到震惊。

标签: haskell random concurrency simulation


【解决方案1】:

保持简单:

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

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

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

【讨论】:

  • 感谢推送;诚然,有了所有可用的“更高级”的东西,我一直在回避我认为的并发基础知识。当我得到令人满意的实施时,我可能会更新这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 2014-05-19
  • 2021-04-07
  • 2016-08-26
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多