我们有一个 12 核的 MacPro 来做一些蒙特卡罗计算。它的英特尔至强处理器启用了超线程 (HT),因此实际上应该有 24 个进程并行运行才能充分利用它们。但是,我们的计算在 12x100% 上比 24x50% 上运行更有效,因此我们尝试通过系统偏好设置中的窗格关闭超线程Processor
,以获得更高的性能。也可以通过以下方式关闭 HT
hwprefs -v cpu_ht=false
然后我们进行了一些测试,结果如下:
- 12 个并行任务在不带或不带 HT 的情况下同时运行,令我们失望。
- 如果 HT 关闭,24 个并行任务会丢失 20%(不是我们想象的 -50%)
- 开启 HT 后,从 24 个任务切换到 12 个任务会降低 20% 的效率(同样令人惊讶)
- 当 HT 关闭时,从 24 切换到 12 不会改变任何内容。
似乎超线程只会降低我们计算的性能,而且没有办法避免它。我们用于计算的程序是用 Fortran 编写并用gfortran
. 有没有办法让这块硬件更高效?
更新:我们的蒙特卡洛计算 (MCC) 通常分步进行,以避免数据丢失和其他原因(并非总是可以避免此类步骤)。在我们的例子中,每个步骤都包含许多持续时间可变的模拟。由于每个步骤都分为多个并行任务,因此它们也具有可变的持续时间。本质上,所有较快的任务都必须等到最慢的任务完成。这一事实迫使我们采取更大的步骤,由于平均,这些步骤在时间上的偏差更小,因此处理器不会浪费时间在等待上。这是我们使用 12*2.66 GHz 而不是 24*1.33 GHz 的动机。如果可以关闭 HT,那么通过从 24 个任务 w/HT 切换到 12 个任务 w/o HT,我们将获得大约 +10% 的性能。然而,测试表明我们损失了 20%。
对于测试,我使用了相当大的步骤,但通常步骤更短,因此效率更高。
还有一个原因 - 我们的某些计算需要 3-5 GB 的内存,因此您可能会看到我们拥有 12 个快速任务是多么经济。我们正在努力实现共享内存,但这将是一个长期的项目。因此,我们需要找出如何使现有的硬件/软件尽可能快。