我的电脑配有2个Intel®Xeon®处理器X5650,每个处理器有6个核心,支持HT。但是当我运行MPI代码时,它不会超过6倍的速度。 以下是一些当前的运行时间:
所以直到6开始进程它按计划运行。所有核心都处于活动状态,运行时减少是线性的。 与OpenMP相同。 这可能是因为mashine的缓存不连贯吗? 有一天我在MPI会议上听说过它。
有解决方法吗?
答案 0 :(得分:1)
简而言之,是的,但这是特定于问题的 - 某些应用程序根本无法与内核数量线性扩展,并且有很多原因(例如,应用程序中的线程/数据级并行性不足)。事实上,根据我的经验,你很难找到一个应用程序,而不是令人尴尬的并行应用程序(例如Monte Carol模拟?),它们可以与核心数量完美匹配。如果没有对应用程序进行分析,任何人都不可能给出准确的答案,因为有很多可能的原因导致子线性缩放。
但是,在您的情况下,最明显的问题可能是由超线程(HT)引起的。您展示的最直观的结果是,从12个线程移动到24个线程(即,当最大程度地使用超线程时)几乎不会加速。在某些情况下,HT不会导致性能提升。这通常是在:
这是因为最终HT通过在该核心上运行的线程之间共享CPU核心内的许多执行单元来工作。例如,如果每个核心都有一个浮点单元,对于在该核心上运行的所有线程共享,则无论您使用多少线程,每个时钟周期都不能执行多个浮点运算。为了调查这是否是原因,我建议禁用HT(因为甚至可能存在性能开销)。在Unix机器上通常有一个内核启动选项来禁用HT。
最后,另一个典型问题是双插槽机器通常是(?)NUMA机器。这意味着从不同的CPU访问相同的存储器内容可能需要不同的时间。所以你的实现应该是NUMA意识。