为什么矩阵乘法在用7个核心的工作站上慢于我的笔记本电脑上的速度较慢



我运行以下MATLAB代码:

rng(1)
matrix_size = 200;
iterations = 100000;
A = rand(matrix_size);
B = rand(matrix_size);
profile on
for i = 1:iterations
  A * B;
end
profile off

在我的Macair(Intel(R)Core(TM)I5-4260U CPU @ 1.40GHz)上,这需要39s。在具有7个核心(Intel(R)Xeon(R)CPU E5-2687W V4 @ 3.00GHz)的工作站上,这需要62s。

我没有指定-singleCompThread。工作站有12个核心,但是运行了5个单线程流程。我自己有7个核心。他们一直被最大化。

这怎么可能?

使用-singleCompThread运行上述代码时,它将在54S中完成。

引用数学支持团队帖子:

从MATLAB 7.4(R2007A)开始,MATLAB支持多线程计算 对于多种功能和表达式 元素函数(例如y = 4*x*(sin(x) x^3))。这些功能 自动执行多个线程,您无需 明确指定命令在您的代码中创建线程。

供函数或表达式执行速度更快(加快多个) 内核,以下条件必须为真:

1)函数执行的算法中的操作是 容易被分区为可以同时执行的部分 并且几乎不需要沟通或几乎需要的顺序操作。 所有元素操作都是这种情况。

2)数据大小足够大,因此并发的任何优点 执行大于分区数据和管理所需的时间 单独的执行线程。例如,大多数功能仅加快 当数组大于几千个元素时。

3)该操作不是在处理时间为内存的内存 以内存访问时间为主导,就像简单操作一样 例如元素添加。通常,更复杂 功能比简单功能更好。

您的情况不完整2.或3.乘法非常快速且简单,并且内存绑定,并且您的矩阵相对微小。从您的测试中,使用-singlecompthread可以看出,多线程似乎包括更多开销。您可以使用较大的矩阵尝试基准测试,看看差异是否更改。您还可以使用-singlecompthread上的MacBook上的基准测试,以查看相对单线性能是否属于预期范围。

另一个(部分)解释可能是桑迪桥和哈斯韦尔之间的不同矢量说明,即avx2。不过,我会先进行基准测试。

还请注意,Matlab Profiler关闭了JIT。因此,您获得的结果可能无法与您基准对抗的任何实际情况相提并论。

最新更新