我们得到了一个12核的MacPro来做蒙特卡罗计算。它的Intel Xeon处理器启用了超线程(HT),因此实际上应该有24个进程并行运行,以充分利用它们。然而,我们的calcs在12x100%上运行的效率比24x50%更高,因此我们尝试通过系统首选项中的Processor窗格关闭超线程,以获得更高的性能。你也可以通过
hwprefs -v cpu_ht=false然后我们做了一些测试,下面是我们得到的结果:
超线程似乎只是降低了我们计算的性能,没有办法避免它。我们用Fortran编写并用gfortran编译了calcs的程序。有什么方法可以让这款硬件更高效吗?
更新:-我们的蒙特卡罗计算(MCC)通常是按步骤进行的,以避免数据丢失,并由于其他原因(不总是能够避免这样的步骤)。在我们的例子中,每个步骤都包含了许多可变持续时间的模拟。由于每个步骤在多个并行任务之间被分割,所以它们的持续时间也是可变的。基本上,所有更快的任务都要等到最慢的时候才能完成。这一事实迫使我们采取更大的步骤,以较少的时间偏差,因为平均,所以处理器不会浪费他们的时间等待。这是我们拥有12*2.66 GHz而不是24*1.33 GHz的动机。如果可以关闭HT,那么我们将从24任务w/ HT切换到12任务w/o HT,从而获得大约10%的性能。然而,测试表明我们损失了20%。因此,我的结论是,计算效率低了30%。
对于测试,我使用了相当大的步骤,但通常步骤更短,因此效率更高。
还有一个原因-我们的一些计算需要3-5 GB的内存,所以您可能会看到,对于我们来说,有12个快速任务是多么经济。我们正在努力实现共享内存,但这将是一个长期的项目。因此,我们需要找出如何尽快使现有的硬件/软件。
发布于 2010-10-04 13:31:16
这与其说是一个回答,不如说是一个延伸的评论:
我不觉得你的观察令人惊讶。超线程是一种糟糕的并行化方法,它允许您在一个CPU上有2条待定指令管道。但它不提供额外的浮点或整数算术单位或更多寄存器;当一个管道无法给ALU (或现在称为ALU)提供数据时,另一个管道在一两个时钟周期内被激活。这与在没有超线程的CPU上的情况形成对比,在指令管道停止时,在CPU恢复到速度之前,必须用来自另一个进程的指令刷新和填充指令。
维基百科关于超线程的文章很好地解释了这一切。
如果您正在运行的负载中,管道停止是完全同步的,并且代表了程序组合的总执行时间的主要部分,那么您可以通过从一个非超线程处理器转到一个超线程处理器,将程序的速度提高一倍。
如果(这是一个很大的假设),您可以编写一个从未停止在指令管道中的程序,那么超线程将不会提供任何好处(在执行加速方面)。您所测量到的不是HT造成的加速(嗯,它是HT导致的加速,但实际上您并不希望那样),而是线程无法保持管道的运动。
你要做的实际上是减少因HT而导致的加速!或者,您必须通过保持管道填充来提高这12个进程(每个核心一个进程)的执行率。就我个人而言,当我在12个核心上优化程序的执行时,我会关闭超线程。
玩得开心。
发布于 2010-10-04 13:19:07
我有点难以理解你对基准的描述。
让我们将100%的工作定义为你通过12项任务完成的工作量。如果你能在同一时期内完成两倍的工作,我们就称之为200%。那么,你会在另外三个盒子里放多少数字呢?
编辑:与您的数字更新。
without HT with HT
12 tasks 100% 100%
24 tasks 100% 125%因此,我的理解是,在禁用HT时,线程基本上是暂停的(例如当线程等待来自内存或磁盘的数据时),因此它们实际上不会在2.66 GHz上运行,但会稍微少一点。在启用超线程的情况下,CUP将切换任务,而不是暂停这些短暂的间隙,因此所使用的处理能力的总量会增加。
发布于 2010-10-04 11:58:07
那么,这就意味着在HT打开的情况下,从12项任务切换到24项任务可以提高20%的效率!很好的基准!
另一方面,如果您的程序是为了使每个线程只能在一个单独的任务上工作(而不是能够将单个任务拆分成较小的块并并发进行),那么为了减少每个任务的延迟(从开始到完成),您只需要将软件中的线程数量限制在12个。硬件HT开关可以保持在任何位置。
https://stackoverflow.com/questions/3854882
复制相似问题