现在电脑大多数是多核的,比如我的电脑是宏基的,下面是驱动精灵硬件检测的结果。
我们可以看到,硬件概要中显示CPU是双核的,现在我们再看看CPU(处理器)的具体信息。同样是使用驱动精灵检测结果。
这时我们会看到,核心/线程部分显示的是双核、四线程。那么这里的四线程又是什么意思呢?我们再看看任务管理器中性能选项的情况,见下图
我们看到在CPU使用记录一项,显示出了四个块,这里的四个块就是对应着前面处理器情况的四线程。这个线程就是超线程,也叫硬件线程(相对于软件的软件线程,可以参见下图)。如果打开任务管理器看不到线程数,可以通过查看--->选择列,将线程列选上。
这里超线程的数量就是逻辑内核的数量。也就是说,物理内核可以通过超线程技术使得逻辑内核数增加。
对于超线程的定义,百度百科说法如下:
“超线程”(Hyperthreading Technology)技术就是通过采用特殊的硬件指令,可以把两个逻辑内核模拟成两个物理超线程芯片,在单处理器中实现线程级的并行计算,同时在相应的软硬件的支持下大幅度的提高运行效能,从而实现在单处理器上模拟双处理器的效能。其实,从实质上说,超线程是一种可以将CPU内部暂时闲置处理资源充分“调动”起来的技术。
可见对于同一个物理内核中通过超线程增加到两个逻辑内核的内核,在本质上是在应用同一个内核。所以一旦这同一个物理内核中的逻辑内核在同一时间要访问同样的资源时,就会产生竞态(race condition),这时这两个逻辑内核就只能是交叉并发(interlevel concurrent)的访问。也就是说,只能是等前面一个逻辑内核访问完了,后一个逻辑内核才能访问。
所以逻辑内核是有瓶颈的,而在软件运行层面进行并行编码时,使用的是逻辑内核,这样当软件的一些任务并行运行在同一内核的两个逻辑内核时,一旦同时访问同一资源,运行速度就会受限。
所以在软件编程时,当提升最大并行度之后,并不一定能明显改善或提升性能。下面是截自《.NET 4 Parallel Extensions》一书中第六章Working with ForAll中的图
这个图是基于四个物理内核、八个逻辑内核的,会看到当内核数在四个之后的提速的加速度在降低,超到后面越趋于平稳。这就是因为前面的提速是基于物理内核的内核来运行的,而后面再提升并行度,是在原物理内核的基础上分出的其他逻辑内核运行的。因为同一物理内核的逻辑内核在同时运行时有可能会因产生竞态,自然速度就不会像物理内核提升那么明显了。
所以并不是一味的增加内核(软件任务的并行度)就可以提升性能,有时反而会因为将内核悉数用光,导致其他的任务或者程序没有足够的内核来运行,最终影响整体或者其他程序假死或者崩溃。
所以,在并行开发时就必须在并行度和性能之间取得一个平衡。
转载请注明出处http://blog.csdn.net/xxdddail/article/details/16896693