为什么 MATLAB 在我的 Windows 服务器上这么慢?

Why is MATLAB so slow on my Windows server?

我在服务器 运行 MS Windows Server 2008 R2 Enterprise v 6.1 (SP1) 上安装了 Matlab R2017a,基准测试结果很糟糕:

bench
3.6424   0.5267   0.2114   5.0303   1.5557   3.4980

[列 = LU、FFT、ODE、稀疏、2-D、3-D]

请注意,它对于 LU 和 Sparse 特别慢。

服务器有这个硬件: CPU:Intel Xeon E7320 @ 2.13GHz(4 个物理处理器,16 个逻辑处理器) 128 GB 内存 64 位操作系统

Matlab 版本:9.2.0.556344 (R2017a) Java 版本:Java 1.7.0_60-b19 与 Oracle 公司 Java Hotspot(TM) 64 位服务器 VM 混合模式。

还有其他用户可以在服务器上在线,但我可以看到他们没有对系统造成压力,并且已经验证这些 运行 时间是稳定的(过去一周测试了多次。

我的问题是这样的:是否有任何其他库或 Matlab 所依赖的东西可能是 "wrong"?我在类似但稍新的服务器上进行了另一个类似的设置,该服务器的基准测试结果更接近我根据规格所期望的结果。我想知道它是否使用了 "wrong" 线性代数模块或其他东西。

替代解释 我知道 Matlab 运行 在特定的 AMD Opteron CPU 上非常慢(我碰巧也在这样的服务器上工作过Matlab,link https://se.mathworks.com/matlabcentral/answers/33939-poor-matlab-performance-on-amd-based-computer)。 Intel Xeon E7320 是否可能存在类似问题?

编辑:Xeon E7320 按照 Peter 的建议。

更新:我不确定 Matlab 的 bench 是否只利用了单个 CPU 内核、多个 CPU 内核或 GPU(OpenCL/CUDA)。如果它可以使用 GPU 加速,那将产生 巨大的 差异。 (特别是如果您的 "slow" 服务器中根本没有)。

正如评论中所讨论的那样, 在某些基准测试中的速度提高了 10 倍,但在某些其他组件上的速度仅提高了 2 或 1.5 倍。 (但我不确定 Matlab 的版本是否受到控制;您 link 提到的那个帖子提到不同版本的 Matlab 在他们的 bench 中做不同的工作量)。


此答案的其余部分假设您的测试利用了所有 CPU 核心(否则使用旧的多核毫无意义机器)。但是不考虑GPU。


我认为你的 CPU 实际上是 a 65nm Core2-based Xeon E7320,而不是 "E3720"(没有 google 命中)。你拿什么比? 您的 Tigerton CPU 很古老(大约 10 岁),当然它们很慢。 (Tigerton 与 Conroe/Merom 第一代 Core2 的微架构相同)。

与现代 CPU 相比,您的内存带宽和缓存速度 非常低 ,而且只有 SSSE3,没有 AVX 或 FMA。这些 CPU 没有内置内存控制器,因此 all 4 sockets are sharing the memory controller hub (MCH) via separate 1066MHz Front-Side Buses. 内存带宽不会随着插槽数量的增加而增加,而且不是很好。 多年来,内存带宽的增长速度快于每核性能。根据 link,四路 16 核 Tigerton(就像您拥有的那样)仅比四路 8 核 Barcelona Opteron 好一点。对于 CPU 绑定的工作负载来说还不错,但是内存绑定的工作负载会非常糟糕。


除了低时钟速度外,它的时钟速度比现代 CPU 慢得多。 IDK 那些时间应该是什么样的(我来这里是为了 [performance] 标签,而不是 Matlab),但是 3GHz 四核 i5 或 i7 Haswell / Skylake 台式机或大功率笔记本电脑完全有可能比你的 16 核恐龙机器还快。[=​​18=]

(实际上,该基准测试甚至与核心数量成比例吗?如果不是,单线程内存带宽可能真的不好。)

Sandybridge(对于所有代码,包括非 SIMD 工作负载)在性能上发生了非常大的飞跃,并且在您的机器和现代 CPU 之间还有其他几个较小的飞跃。 SnB 可以 运行 每个时钟加载 2 条指令,而以前的 Intel(比如你的 Core2)是 1 条指令。

对于优化库将利用的 FP 特定内容,x86 ISA 扩展一直很重要:AVX 将 SIMD 向量宽度加倍,将 FLOPS 加倍(在具有全角执行单元的英特尔 CPUs 上) . FMA 在一条指令中执行 mul+add,可能使 FLOPS 加倍。微架构改进也很重要:Haswell 有两个 FMA 单元,而早期的 CPUs 有一个 FP 加法器和一个 FP 乘法器,同样有可能使 FLOPS 加倍。只有连续内存和高计算与内存工作负载才能充分利用这一点,例如一个密集的 matmul,但在那种情况下,一个 Haswell 核心所做的工作与 8 个 Tigerton 核心一样多。

我认为如果 CPU 有 Matlab 可以利用 AVX + FMA。


顺便说一句,它不仅仅是 16 个 "logical" 处理器。你没有超线程,所以你有一个 4 插槽系统,有四个四核 CPUs,16 个物理内核。 (而这些 "quad core" 芯片实际上是同一封装中的两个独立的双核芯片,according to wikipedia

那么就需要相互通信的物理芯片数量而言,有8个(每个封装两个)。这是到达其他 CPU 的很多跃点,因此内核之间的同步比单芯片四核更昂贵。 (甚至可能比带有一对 18 核 CPUs 之类的现代双路至强机箱还要糟糕)。

请注意,内存的高延迟也会损害内存带宽:请参阅此答案的 部分关于优化 memcpy/memset 以及存储带宽在英特尔 CPUs 中的工作方式。