旧标题:* R2016b中的小矩阵乘法慢得多比R2016a * (更新下面)
我发现R2016b中小矩阵的乘法似乎比R2016a小得多。这是一个最小的例子:
r = rand(50,100);
s = rand(100,100);
tic; r * s; toc
在R2016a和0.018s R2016b中需要大约0.0012s。
创建一个人工循环,以确保这不是一些初始开销或某些导致相同的损失因素:
tic; for i = 1:1000, a = r*s; end, toc
这在R2016a和2.1s R2016b中大约需要0.18s。
一旦我使矩阵变得更大,比如说r = rand(500,1000);
和s = rand(1000,1000)
,版本表现相似(R2016b甚至可能快〜15%)。任何人都知道为什么会这样,或者可以在另一个系统上验证这种行为?
我想知道它是否与新的算术扩展实现有关(如果此功能对于小矩阵乘法有一些成本):http://blogs.mathworks.com/loren/2016/10/24/matlab-arithmetic-expands-in-r2016b/
更新
经过多次测试,我发现这种差异不在MATLAB版本之间(我的道歉)。相反,它似乎是我的基础工作区中的内容的差异......更糟糕的是,基础工作区中的变量类型。
我清理了一个巨大的工作区(它有许多大型单元阵列,有许多小的,不同大小的矩阵条目)。如果我清除变量并执行r * s的计时,我的运行时间(x10-x100)要比加载工作空间之前快得多。
所以问题是,为什么工作空间中的变量会影响两个小变量的矩阵乘法?更重要的是,为什么某些类型的变量会大幅减慢工作空间。
这是一个例子,其中工作空间中单元格形式的大变量影响矩阵乘法或两个不相关矩阵的运行时间。如果我将这个单元格折叠成矩阵,效果就会消失。
clear;
ticReps = 10000;
nCells = 100;
aa = rand(50,100);
bb = rand(100, 100);
% test original timing
tic; for i = 1:ticReps, aa * bb; end
fprintf('original: %3.3f\n', toc);
% make some matrices inside a large number of cells
q = cell(nCells, nCells);
for i = 1:nCells * nCells
q{i} = sprand(10000,10000, 0.0001);
end
% the timing again
tic; for i = 1:ticReps, aa * bb; end
fprintf('after large q cell: %3.3f\n', toc);
% make q into a matrix
q = cat(2, q{:});
% the timing again
tic; for i = 1:ticReps, aa * bb; end
fprintf('after large q matrix: %3.3f\n', toc);
clear q
% the timing again
tic; for i = 1:ticReps, aa * bb; end
fprintf('after clear q: %3.3f\n', toc);
在两个阶段,q占用约2Gb。结果:
original: 0.183
after large q cell: 0.320
after large q matrix: 0.175
after clear q: 0.184
答案 0 :(得分:0)
我收到了mathworks的更新。
据我所知,他们说这是Windows内存管理器的错误,它以相当分散的方式将内存分配给大型单元阵列。由于(无关)乘法需要内存(用于输出),因此由于单元引起的内存碎片,获取此内存现在需要更长的时间。 Linux(已测试)没有此问题。