为什么矩阵乘法在具有7个内核的工作站上比在我的笔记本电脑上运行速度慢?

时间:2017-03-07 13:49:27

标签: matlab parallel-processing

我运行了以下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)上,这需要39秒。在具有7核(Intel(R)Xeon(R)CPU E5-2687W v4 @ 3.00GHz)的工作站上,这需要62秒。

我没有指定-singleCompThread。工作站有12个核心,但有5个单线程进程在运行。我(差不多)有7个核心给自己。他们一直都是最大限度的。

这怎么可能?

使用-singleCompThread运行上述代码时,它会在54秒内完成。

1 个答案:

答案 0 :(得分:1)

引用Mathworks支持小组post

  

从MATLAB 7.4(R2007a)开始,MATLAB支持多线程计算   对于许多函数和表达式的组合   逐元素函数(例如,y = 4 * x *(sin(x)+ x ^ 3))。这些功能   自动在多个线程上执行,您不需要   显式指定在代码中创建线程的命令。

     

使函数或表达式在多个上执行得更快(加速)   核心,必须满足以下条件:

     

1)该功能执行的算法中的操作是   容易划分为可以同时执行的部分,   并且需要很少的通信或很少的顺序操作。   所有元素操作都是如此。

     

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

     

3)操作不受处理时间限制的内存限制   由内存访问时间占主导地位,就像简单操作一样   如元素添加。作为一般规则,更复杂   函数比简单函数更快地加速。

你的情况没有满满2.或3.乘法非常快速和简单并且受内存限制,你的矩阵相对较小。从使用-singleCompThread的测试中可以看出,多线程似乎包含更多开销。您可以使用更大的矩阵尝试基准测试,看看差异是否会发生变化。您还可以使用-singleCompThread在Macbook上尝试基准测试,以查看相对单线程性能是否落入预期范围。

另一个(部分)解释可能是Sandy Bridge和Haswell之间的不同向量指令,即AVX2。在调查之前,我先做基准测试。

另请注意,Matlab分析器会关闭JIT。因此,您获得的结果可能无法与您进行基准测试的实际案例相媲美。