首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过并发提高仿真性能

通过并发提高仿真性能
EN

Stack Overflow用户
提问于 2012-05-16 23:11:11
回答 1查看 281关注 0票数 4

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

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

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

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

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

读了Haskell并发性,我对MVarTVarTChanacid-state等术语感到头晕目眩。似乎很清楚的是,这个过程的并行实现看起来与我在上面链接的那个非常不同。但是,这个过程本身在本质上似乎是一个相当温和的算法,本质上是一个内存中的数据库,这是一个问题,我肯定有人曾经遇到过。

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

如果目标是提高性能而不是顺序实现,那么什么样的数据结构、并发概念等适合于这类任务?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-16 23:16:07

保持简单:

  • 用于轻量级、超便宜线程的forkIO
  • MVar,用于快速、线程安全的共享内存。
  • 以及适当的序列类型(可能是向量,如果您只在前面列出)
  • 一个好的统计数据
  • 和快速随机数源(例如,默森-随机-纯64)

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

RWH对并发Haskell的包括基本知识有一章介绍。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10627980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档