4

考虑在一个包含Doubles. 只要我愿意,请执行以下操作:

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

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

顺序可见

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

并发可见

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

阅读 Haskell 并发让我头晕目眩,诸如、、、、等等之类的术语。MVar似乎很清楚的是,这个过程的并发实现看起来与我上面链接的完全不同。但是,该过程本身似乎本质上是一个相当驯服的算法,它本质上是一个内存数据库,我敢肯定有人以前遇到过这个问题。TVarTChanacid-state

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

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

4

1 回答 1

4

把事情简单化:

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

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

RWH 有一章介绍并发 Haskell的基础知识。

于 2012-05-16T23:16:07.447 回答