2012-02-28 35 views
1

这是一个非常普遍的问题,大多只是概念上的问题。我正在考虑测试随机数生成器,以查看其在某些x值(如掷骰子的前6位)上的均匀分布的有效性。在一个简单的循环中这样做是我现在拥有它,但我正在考虑多线程仿真。带信号量和伪随机数的概念多线程

我想知道这是否会给我任何加速,因为我将只有一个随机数生成器在信号量保护的所有线程之间共享(需要确保没有两个线程访问并且同时生成随机数意味着重复结果)。由于每个线程几乎不会有其他操作(只要用于检查和增加x的语句)会对它进行线程化,甚至会给我更快的结果,或者对一个随机数生成器的依赖性意味着它将基本上与单个相同线?

回答

0

理论上你应该看到性能的增加,至少在线程数量等于正在使用的内核数量之前。但是,实际上,您将添加代码(并因此执行时间)来处理多线程基础结构,并且如果每个线程的大部分时间都花在等待慢RNG上,您可能会看到性能下降。

另一方面,您可能可以通过一些巧妙的方式提高性能。例如,您可能有一项任务专门用于生成随机数,如果您只查找1到6的值,则可能能够从RNG的每个结果中生成多个值。您可以将这些值放入队列中,让其他任务从队列中读取。当然,你必须小心,你的优化不会改变RNG的分布。

除非计算执行周期的想法激起你的兴趣,否则找到答案的最好方法就是尝试它。使用探查器来发现大部分时间都花在了什么地方 - 这对于人类直觉而言是非常困难的,甚至有经验的开发人员经常对结果感到惊讶。

+0

非常棒的建议,从结果处理中分离出rng。不完全确定我将如何使用1 rng来模拟多个卷,而不会与分配有关。我从来没有使用过一个分析器,需要一个借口来启动,我认为不应该使用它作为一个,谢谢。 – forTruce 2012-02-28 16:18:54

+0

只是一个简单的例子:如果您生成的数字从1到6,则每个数字只需要3位。如果您的RNG生成32位值,则可以从每个值中获得10组3位。 – 2012-02-28 16:23:40

+0

我真的怀疑你会看到在另一个线程中运行RNG的速度提升。同步随机数队列的开销远远超过任何好处。 – Gray 2012-02-28 16:45:35

5

我想你已经回答了你自己的问题。您的计划将导致单线程使用RNG,不同线程轮流使用单个线程。你可能会达到一个加速,但只有一个负面的。

+1

“达到加速”真的意思是“影响速度”?加速对我意味着积极。 – Gray 2012-02-28 16:07:02

+0

+1,是的,这是RNG时间加上锁定开销 - 毫无意义。 – 2012-02-28 16:08:48

0

需要确保没有两个线程访问,并在 产生随机数的同时

这是不是意味着真的只有一个工作线程将被运行,所以你不使用多线程的好处。或者我错过了你提到的在multipel线程上分发一些工作的一点?

如果您以某种方式改进了多线程RNG访问的总体设计 - 考虑使用ReaderWriterLock技术而不是Semaphore

+0

我猜我认为可能会在一定程度上加速,因为一个线程会访问rng,然后必须检查和Inc相应的值。当它这样做时,另一个线程将访问rng。另外,我很好奇地拒绝readereriterlock和他的这可能会帮助,会产生下一个号码requirewriter访问rng更新种子值?肯定说出来我的屁股在这里。 – forTruce 2012-02-28 16:14:16

+0

我相信解决方案取决于RNG的实施,您是使用自制还是内置?您正在使用哪种语言/框架进行开发? – sll 2012-02-28 16:23:10

+0

目前我只是使用内置于rng的C#。 – forTruce 2012-02-28 16:28:38