And*_*kau 6 macos fortran intel gfortran hyperthreading
我们得到了一个12核的MacPro来进行蒙特卡罗计算.它的Intel Xeon处理器启用了超线程(HT),因此实际上应该有24个进程并行运行以充分利用它们.但是,我们的计算效率比12x100%高出24x50%更高效,因此我们尝试Processor在系统首选项中通过窗格关闭超线程以获得更高的性能.人们也可以关闭HT
hwprefs -v cpu_ht=false
Run Code Online (Sandbox Code Playgroud)
然后我们进行了一些测试,这是我们得到的:
似乎超线程只是降低了我们计算的性能,并且没有办法避免它.我们用于计算的程序是用Fortran编写的,并使用gfortran.有没有办法让这个硬件更高效?
更新:我们的蒙特卡罗计算(MCC)通常是分步进行的,以避免数据丢失和由于其他原因(并不总是可以避免这些步骤).在我们的例子中,每一步都包含许多具有可变持续时间的模拟.由于每个步骤在多个并行任务之间分割,因此它们也具有可变持续时间.基本上,所有更快的任务都必须等到最慢完成.这一事实迫使我们采取更大的步骤,由于平均而导致时间偏差减少,因此处理器不会浪费时间等待.这是我们拥有12*2.66 GHz而不是24*1.33 GHz的动机.如果可以关闭HT,那么通过从24个任务w/HT切换到12个没有HT的任务,我们可以获得大约+ 10%的性能.但是,测试表明我们松了20%.
对于测试,我使用了相当大的步骤,但通常步骤较短,因此效率变得更高.
还有一个原因 - 我们的一些计算需要3-5 GB的内存,因此您可能会看到我们有12个快速任务的经济性.我们正在努力实现共享内存,但它将成为一个冗长的术语项目.因此,我们需要了解如何尽可能快地制作现有的硬件/软件.
这更像是一个扩展的评论而不是一个答案:
我发现你的观察结果非常令人惊讶.超线程是一种穷人的并行化方法,它允许您在一个CPU上拥有两个待处理指令的管道.但它不提供额外的浮点或整数运算单元或更多寄存器; 当一个管道无法提供ALU(或者这些天所称的任何管道)时,另一个管道在一两个时钟周期内被激活.这与没有超线程的CPU的情况形成对比,其中当指令流水线停止时,必须在CPU恢复速度之前刷新并重新填充来自另一个进程的指令.
如果您正在运行管道停顿完全同步并且代表程序混合总执行时间的主要部分的负载,那么您可以通过从非交叉线程处理器转换到超线程处理器来使程序的速度加倍.
IF(这是一个很大的if)你可以编写一个从未在指令管道中停滞的程序,然后超线程将无法提供任何好处(就执行加速而言).你测量的不是由于HT的加速(好吧,它是由于HT加速,但你实际上并不想要)但你的线程未能保持管道移动.
你要做的就是降低HT的加速!或者,您必须通过保持管道填充来提高12个进程(每个核心一个)的执行率.就个人而言,当我在12个内核上优化程序的执行时,我会关闭超线程.
玩得开心.
| 归档时间: |
|
| 查看次数: |
6307 次 |
| 最近记录: |