我有一个双核机器,有4个逻辑处理器,多亏了超线程.我正在执行SHA1在C#中的图像前蛮力测试.在每个线程中,我基本上都有一个for循环,并计算一个SHA1哈希,然后将该哈希与我正在寻找的哈希进行比较。我确保所有线程以完全分离的方式执行。他们之间没有分享记忆。(除了一个变量: long count,我在每个线程中使用:
System.Threading.Interlocked.Increment(ref count);
我得到约100万sha1 1/s与2个线程和130万sha1 1/s与4个线程。我不明白为什么在这种情况下我要从HT那里得到30%的奖金。两个核心都应该忙着做他们的工作,所以增加超过2个线程的数量不会给我带来任何好处。有人能解释原因吗?
发布于 2013-10-17 06:57:03
超线程有效地为您提供了更多的内核,用于整数操作--它允许两组整数操作在单个物理核上并行运行。据我所知,它无助于浮点操作,但据推测,SHA-1代码主要是整数运算,因此速度加快。
当然,它不像有4个真正的物理核那么好--但它确实允许更多的并行性。
发布于 2013-10-17 07:29:12
禁用BIOS中的HT,并再次对2个线程进行测试。HT只在一个虚拟核使用CPU指令集,第二个执行使用FPU寄存器的指令时,才会产生一些加速。
发布于 2014-01-29 21:34:49
SMT/超线程允许在同一个物理核心上的多个线程(通常是两个)执行--其中一个通常是等待另一个线程遇到阻塞,然后正在执行的线程将切换。
货摊会发生--大多是缓存失误。即使您没有遍历相同的内存,也不能保证所述内存已经在缓存中(因此在访问它时会导致延迟),也不能保证它不会映射到另一个线程映射内存到的缓存的同一行。
因此,两个线程几乎总是受益于SMT/超线程,除非它们所遍历的数据已经存在于缓存中。这实际上是一种不寻常的情况--一种算法通常需要预取其数据,而且不需要使用缓存所能容纳的更多的数据,或者不覆盖其他线程试图缓存的内存--这需要了解核心上的其他线程。这通常是不可能的,因为它是由操作系统抽象掉的。
大多数算法没有被调优到这个程度,特别是因为它通常只有控制台专用游戏或其他硬件专用应用程序,可以保证缓存的最低规格,更重要的是,对在同一核心上并发运行的其他线程有很好的了解。这也是大型缓存有利于现代CPU性能的主要原因之一。
https://stackoverflow.com/questions/19420137
复制相似问题