为什么超线程对我的算法有益
本文关键字:算法 我的 超线程 为什么 | 更新日期: 2023-09-27 18:35:48
由于超线程,我有一台带有 4 个逻辑处理器的双核机器。我正在 C# 中执行 SHA1 前映像暴力测试。在每个线程中,我基本上都有一个 for 循环并计算一个 SHA1 哈希,然后将哈希与我正在寻找的进行比较。我确保所有线程完全分离执行。它们之间不共享内存。(除了一个变量:长计数,我在每个线程中使用以下命令递增:
System.Threading.Interlocked.Increment(ref count);
我得到大约 1 百万 sha1/s 与 2 线程和 1.3 百万 sha1/s 与 4 线程。我不明白为什么在这种情况下我从 HT 获得 30% 的奖金。两个内核都应该忙于做他们的事情,所以将线程数增加到 2 个以上应该不会给我带来任何好处。谁能解释为什么?
对于整数操作,超线程有效地为您提供了更多内核 - 它允许两组整数操作在单个物理内核上并行运行。据我所知,它对浮点运算没有帮助,但大概 SHA-1 代码主要是整数运算,因此
加速了。当然,它不如拥有 4 个真正的物理内核 - 但它确实允许更多的并行性。
在 BIOS 中禁用 HT 并再次对 2 个线程进行测试。仅当一个虚拟内核使用 CPU 指令集而第二个虚拟内核执行使用 FPU 寄存器的指令时,HT 才会提供一点加速。
SMT/超线程允许在同一物理内核上执行多个线程(通常是两个)——一个线程通常等待另一个线程遇到停顿,然后正在执行的线程将切换。
停顿时有发生 - 主要是缓存未命中。 即使您没有遍历相同的内存,也不能保证所述内存已经在缓存中(因此在访问时会导致停滞),或者它不会映射到另一个线程将内存映射到的同一行缓存。
因此,两个线程几乎总是受益于 SMT/超线程,除非它们遍历的数据已经存在于缓存中。 这实际上是一个不寻常的情况 - 算法通常需要预取其数据,并且不要使用超过缓存可以容纳的内存,或者不覆盖其他线程试图缓存的内存 - 这需要了解内核上的其他线程。 这通常是不可能的,因为它作系统抽象掉了。
大多数算法都没有调整到这种程度,特别是因为它通常只有控制台专用游戏或其他硬件专用应用程序,这可以保证缓存的某个最低规格,更重要的是,对在同一内核上并发运行的其他线程有深入的了解。 这也是较大的缓存有利于现代 CPU 性能的主要原因之一。