0

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

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

我得到大约 100 万个 sha1/s 的 2 个线程和 130 万个 sha1/s 的 4 个线程。我不明白为什么在这种情况下我会从 HT 获得 30% 的奖励。两个核心都应该忙着做他们的事情,所以将线程数增加到 2 个以上应该不会给我带来任何好处。谁能解释为什么?

4

3 回答 3

4

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

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

于 2013-10-17T06:57:03.303 回答
0

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

于 2013-10-17T07:29:12.577 回答
0

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

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

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

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

于 2014-01-29T21:34:49.310 回答