我们有一个12核MacPro来做一些蒙特卡罗计算。它的Intel Xeon处理器启用了超线程(HT),因此实际上应该有24个进程并行运行以充分利用它们。但是,我们的计算效率比12x100%高出24x50%更高效,因此我们尝试通过系统首选项中的Processor
窗格关闭超线程,以获得更高的性能。
hwprefs -v cpu_ht=false
然后我们进行了一些测试,这就是我们得到的:
似乎超线程只是降低了我们计算的性能,并且没有办法避免它。我们用于计算的程序是用Fortran编写的,用gfortran
编译。有没有办法让这块硬件更有效率?
更新:我们的蒙特卡罗计算(MCC)通常是分步进行的,以避免数据丢失和其他原因(并不总是可以避免这些步骤)。在我们的例子中,每一步都包含许多具有可变持续时间的模拟。由于每个步骤在多个并行任务之间分割,因此它们也具有可变持续时间。基本上,所有更快的任务都必须等到最慢完成。这一事实迫使我们采取更大的步骤,由于平均而导致时间偏差减少,因此处理器不会浪费时间等待。这是我们拥有12 * 2.66 GHz而不是24 * 1.33 GHz的动机。如果可以关闭HT,那么通过从24个任务w / HT切换到12个没有HT的任务,我们可以获得大约+ 10%的性能。但是,测试表明我们松了20%。所以我的结论是计算效率低30%。
对于测试我使用了相当大的步骤,但通常步骤更短,因此效率更高。
还有一个原因 - 我们的一些计算需要3-5 GB的内存,所以你可能会看到我们有12个快速任务的经济性。我们正在努力实现共享内存,但它将成为一个冗长的术语项目。因此,我们需要了解如何尽可能快地制作现有的硬件/软件。
答案 0 :(得分:8)
这更像是一个扩展的评论而不是一个答案:
我发现你的观察结果非常令人惊讶。超线程是一种穷人的并行化方法,它允许您在一个CPU上拥有两个待处理指令的管道。但它不提供额外的浮点或整数运算单元或更多寄存器;当一个管道无法提供ALU(或者这些天所称的任何管道)时,另一个管道在一两个时钟周期内被激活。这与没有超线程的CPU的情况形成对比,当指令管道停止时,必须在CPU恢复速度之前刷新并重新填充来自另一个进程的指令。
Wikipedia article on hyperthreading很好地解释了这一切。
如果您正在运行管道停顿完全同步并且代表程序混合总执行时间的主要部分的负载,那么您可以通过从非交叉线处理器转换到超线程处理器来使程序的速度加倍。
IF(这是一个很大的问题)你可以编写一个从未在指令管道中停滞的程序,然后超线程将无法提供任何好处(就执行加速而言)。你测量的不是由于HT的加速(好吧,它是由于HT加速,但你实际上并不想要)但你的线程未能保持管道移动。
你要做的就是降低由于HT造成的加速!或者,您必须通过保持管道填充来提高12个进程(每个核心一个)的执行率。就个人而言,当我优化程序在12个核心上的执行时,我会关闭超线程。
玩得开心。
答案 1 :(得分:2)
我在理解您对基准的描述时遇到了一些困难。
让我们将100%定义为您完成12项任务并完成的工作量。如果你能够在相同的时间内完成两倍的工作,我们会称之为200%。那么,你在其他三个方框中放的数字是多少?
编辑:已更新您的号码。
without HT with HT
12 tasks 100% 100%
24 tasks 100% 125%
所以,我的理解是,在HT被禁用的情况下,当你的线程基本暂停时(例如当他们等待来自内存或来自磁盘的数据时)存在时间间隔,因此它们实际上并不在2.66 GHz运行,但少一点。启用超线程后,CUP会切换任务而不是暂停这些瞬间间隙,因此使用的处理能力总量会增加。
答案 2 :(得分:1)
嗯,这意味着启用HT后,从12个任务切换到24个任务可将效率提高20%!很好的基准测试!
另一方面,如果编写程序使得每个线程只能处理单独的任务(而不是能够将单个任务拆分成较小的块并同时进行),那么为了减少每个任务的延迟(从开始到结束)您只需要在软件中将线程数限制为12。硬件HT开关可以保持在任何位置。
答案 3 :(得分:0)
在Xcode工具中查看此帖子,以启用/禁用超线程(以及活动的CPU数量)。该设置不会在睡眠或重启期间持续存在:http://www.logicprohelp.com/forum/viewtopic.php?f=5&t=88835
(您运行Instruments应用程序,取消初始屏幕,然后更改CPU首选项)。