2010-10-04 12 views
5

我们得到了一个12核MacPro来做一些蒙特卡洛计算。其英特尔至强处理器启用了超线程(HT),所以实际上应该有24个进程并行运行,以使其充分利用。但是,我们的calc在12x100%上运行效率高于24x50%,因此我们试图通过系统偏好设置中的Processor窗格关闭超线程,以获得更高的性能。你也可以把HT关闭的关闭6核Intel Xeon中的超线程

hwprefs -v cpu_ht=false 

然后我们进行了一些测试,这里就是我们的了:

  1. 12并行任务运行的同时瓦特/或W/O HT我们失望。
  2. 24个并行任务松散20%,如果HT关闭(不-50%,因为我们认为)
  3. 当HT是,从24到12的任务切换由20%(也令人惊讶)降低效率
  4. 当HT已关闭,从24切换到12不会改变任何内容。

看来超线程只会降低我们的计算性能,并且无法避免它。我们用于计算的程序是用Fortran编写的,并编译为gfortran。有没有办法让这个硬件更高效?


更新:我们的蒙特卡罗计算(MCC)通常步骤以避免数据丢失以及因其他原因(它并不总是能够避免步)来完成。在我们的例子中,每个步骤都包含许多可变持续时间的模拟。由于每个步骤都在多个并行任务之间进行分离,因此它们的持续时间也不相同。从本质上讲,所有更快的任务必须等到最慢完成。这个事实迫使我们做出更大的步骤,由于平均,时间偏差较小,所以处理器不会浪费时间等待。这是我们使用12 * 2.66 GHz而不是24 * 1.33 GHz的动机。如果可以关闭HT,那么通过从24个任务(HT)切换到12个任务(不包括HT),我们将获得大约+ 10%的性能。但是,测试表明我们放松了20%。所以我的结论是计算效率低30%。

对于测试我使用了相当大的步骤,但通常步骤较短,所以效率会变得更高。

还有一个原因 - 我们的一些计算需要3-5 GB的内存,所以您可能会看到我们有12个快速任务的经济性。我们正在努力实现共享内存,但这将是一个长期项目。因此,我们需要了解如何尽可能快地制作现有的硬件/软件。

+0

http://forums.macrumors.com/archive/index.php/t-733238.html – rwong 2010-10-04 11:53:45

+0

通常这可以在BIOS设置中关闭,但我不熟悉Mac,因此可能不适用。 – 2010-10-04 11:54:12

+2

在你的问题中有一些奇怪的东西......你似乎从HyperThreading获得*,但你会禁用它?你说你的计算效率比12/24更高,但是你的测试似乎不这么说。那么,为什么你想禁用HT? – jv42 2010-10-04 12:01:29

回答

7

这是一个多回答一个扩展注释:

我不找你的观察令人惊讶得不得了。超线程技术是一种穷人的并行化方法,它允许在一个CPU上有两条待处理指令流水线。但它不提供额外的浮点或整数运算单元或更多寄存器;当一个流水线无法送入ALU(或者这些天被称为)时,另一个流水线在一个或两个时钟周期内被激活。这与没有超线程的CPU的情况形成对比,当指令流水线停顿时,它必须在CPU恢复速度之前刷新并重新填充来自另一个进程的指令。

Wikipedia article on hyperthreading解释了这一切。

如果您正在运行的加载中管道停顿完全同步并且代表了程序组合的总执行时间的主要部分,那么您可以通过从非超线程处理器转到超线程处理器来加快程序的速度。

IF(这是一个很大的可能),你可以写一个从来没有在指令流水线停顿然后超线程将提供任何好处(在执行加速计)的程序任何责任。你所测量的并不是由HT引起的加速(呃,这是由HT引起的加速,但你实际上并不希望这样做),但是线程的失败使管道保持移动。

你需要做的是实际上减少由于HT的加速!或者,相反,您必须通过保持管道填充来提高12个流程(每个核心一个)的执行率。就我个人而言,我会关闭超线程,同时优化12个内核上的程序执行。

玩得开心。

1

那么,这意味着在HT上,从12个任务切换到24个任务将效率提高 20%!好的基准测试!另一方面,如果你的程序是这样编写的,以便每个线程只能在一个单独的任务上工作(相对于能够将单个任务分成更小的块并同时进行),那么为了减少每个任务的延迟(从开始到结束),您只需要将软件中的线程数限制为12。硬件HT开关可以保持在任一位置。

2

我有点难以理解你对基准的描述。

让我们定义100%是你完成12项任务和完成的工作量。如果你能够在同一时间内完成两次,我们会把它称为200%。那么,你会在其他三个盒子中放入的数字是多少?

编辑:用你的号码更新。

   without HT  with HT 
12 tasks  100%   100% 
24 tasks  100%   125% 

所以,我的理解是,随着HT残疾人,有时间差距,而你的线程基本上暂停(例如,当他们正在等待来自内存或磁盘的数据),所以他们实际上并不运行在2.66 GHz,但少一点。启用超线程功能后,CUP将切换任务,而不是暂停这些瞬间间隙,因此正在使用的处理能力总量会增加。

+0

你的桌子是个好主意。 '12 + HT = 100%','24 + HT = 125%','24-HT = 100%'。我预计会得到'12-HT = 125-140%'而不是100个。但这似乎是不可能的。 – 2010-10-04 13:27:30