2

当我注意到在更多线程上使用独立优先级队列实际上会降低性能时,我试图使用工作线程来加速更大的算法。所以我写了一个小测试用例。

在其中我查询要启动多少个线程,将每个线程设置为自己的处理器,并从我的优先级队列中推送和弹出很多东西。每个线程都拥有自己的优先级队列,它们是单独分配的,所以我不怀疑错误共享。

我把测试用例放在这里,因为它比一个片段长。(处理器亲和位来自NCrunch

优先级队列是我自己创建的,因为 .NET 没有内置队列。如果这有什么不同,它会使用配对堆。

无论如何,如果我用一个线程和一个核心运行程序,它的使用率大约是 100%。 一芯 两个线程/两个内核的使用率下降 两个核心 最终所有 8 个内核的使用率下降到 30%。 八核

这是一个问题,因为性能下降抵消了多线程带来的任何好处。是什么导致性能下降?每个队列完全独立于其他线程的

4

2 回答 2

2

解决 pi 等一些问题更适合并行化,而超线程实际上可以加快速度。当您处理像您这样的严重内存问题时,超线程无济于事,实际上可能会造成伤害。查看 CPU 架构中的“流水线”。

没有多少实际问题可以通过使用 2-cpus 获得 2 倍的加速。cpu 越多,开销越大。在您的测试用例算法中,我怀疑内核必须等待内存子系统。如果您调整内存需求,您将看到性能(和利用率)的提高,因为您将内存需求移近 CPU 缓存大小。

于 2013-02-19T17:38:51.910 回答
0

操作系统正在将处理分配给它想要的任何 CPU。因此,您会看到每个处理器都在做一些工作。

此外,当您说“性能下降”时,您是否检查过系统正在创建多少争用?您可能也在减轻线程之间的争用。

于 2013-02-19T16:55:23.060 回答