.Net 4.0代码将在Core 2 Duo上运行,但不在i5上运行。建议需要

时间:2012-01-14 16:46:35

标签: .net multithreading windows-7 cross-platform cpu

我编写了一些非常复杂的多线程代码。它使用旋转,产量和互锁库。

代码在我的Core 2 Duo 2 GHz机器上完美运行。在我的i5 2.4 GHz双核四线程机器上,它很慢(比在Core 2中慢),或完全无法运行(只是位于0%CPU)。

两台机器都有Win 7 Home Premium 64位和.Net 4.5框架。我的开发机器是Core 2 Duo。我在Visual Studio 2011 Dev Preview中开发。代码是通过优化编译的。

我不能在这里粘贴多行代码。任何人甚至可以开始告诉我为什么这可能发生/在我的代码中寻找什么。我对.Net汇编的结果感到有些震惊。

修改

我测试了MS的BlockingCollection的速度,这也是i5速度的一小部分,但4“核心”都是100%=某种类型的竞争条件。但是,在这里我只是简单地调用TryAdd()/ Take()方法而没有旋转或任何其他类型的线程控制。

2 个答案:

答案 0 :(得分:3)

您极有可能遇到竞争状况。症状就在那里 - 你有复杂的线程代码要么没有运行,要么没有按照预期的方式运行,并且不同机器的行为也各不相同。它在双核盒上运行的事实并不能证明代码是无竞争的......更多核心意味着更微妙的竞争将出现的可能性更高。

简而言之,我们需要代码来帮助。

你提到你正在使用“纺纱类” - 你的意思是SpinLock和SpinWait?

答案 1 :(得分:2)

没有任何代码,我只能推测:

众所周知,Core i5采用了英特尔超线程技术,只需2个内核即可将硬件线程数量增加到4个,因此您有效地拥有四个线程来竞争相同的CPU功能单元。这意味着计算密集型应用程序或需要大量内存带宽的应用程序在使用HT技术的CPU上使用时可能会降低性能。尝试将应用程序生成的线程数修复为2(这样您实际上没有使用HT功能)并查看它是否像原始双核一样运行。

另请查看本文了解HT的特性和弱点:http://software.intel.com/en-us/articles/performance-insights-to-intel-hyper-threading-technology/

这个(有点)相关的SO问题:Multithreaded Java does not speed up