为什么超线程有益于我的算法?

时间:2013-10-17 06:55:30

标签: c# multithreading hyperthreading

由于超线程,我有一台带有4个逻辑处理器的双核机器。我在C#中执行SHA1前映像暴力测试。在每个线程中,我基本上都有一个for循环并计算SHA1哈希值,然后将哈希值与我要查找的值进行比较。我确保所有线程都完全分离。它们之间没有共享内存。 (除了一个变量:long count,我在每个线程中使用增加:

System.Threading.Interlocked.Increment(ref count);

我得到大约1百万sha1 / s 2线程和1.3毫升sha1 / s 4线程。在这种情况下,我不明白为什么我会从HT获得30%的奖金。两个内核都应该忙着做他们的东西,所以增加超过2的线程数不应该给我任何好处。任何人都可以解释原因吗?

3 个答案:

答案 0 :(得分:4)

超线程有效地为整数操作提供了更多内核 - 它允许两组整数操作在单个物理内核上并行运行。据我所知,它对浮点运算没有帮助,但可能是SHA-1代码主要是整数运算,因此加速了。

当然,它不如拥有4个真正的物理内核 - 但它确实允许更多的并行性。

答案 1 :(得分:0)

在BIOS中禁用HT并再次为2个线程进行测试。只有当一个虚拟内核使用CPU指令集并且第二个执行使用FPU寄存器的指令时,HT才会提供一点加速。

答案 2 :(得分:0)

SMT /超线程允许在同一物理内核上执行多个线程(通常是两个) - 一个通常在等待另一个遇到停顿,然后正在执行的线程将切换。

失速发生 - 主要是缓存未命中。 即使您没有遍历相同的内存,也无法保证所述内存已经存在于缓存中(因此在访问时会导致停顿),或者它不会映射到同一行另一个线程将内存映射到的缓存。

因此,两个线程几乎总是受益于SMT /超线程,除非它们遍历的数据已经存在于缓存中。这实际上是一种不寻常的情况 - 算法通常需要预取其数据,另外不要使用超过缓存可以容纳的内容,或者不覆盖其他线程试图缓存的内存 - 这需要知道核心上的其他线程。这通常是不可能的,因为它被操作系统抽象掉了。

大多数算法都没有调整到这个程度,特别是因为它通常只有控制台独有的游戏,或者其他硬件专用应用程序,它们可以保证缓存的某个最低规格,更重要的是,对其他线程有深入的了解。在同一个核心上同时运行。这也是大型缓存有利于现代CPU性能的主要原因之一。