我运行了以下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秒内完成。
答案 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。因此,您获得的结果可能无法与您进行基准测试的实际案例相媲美。