2016-11-15 53 views
1

旧题:*小矩阵乘法慢得多在R2016b比R2016a * (更新下面较大的工作空间变量影响无关变量的乘法运行

我发现小矩阵的乘法似乎要小得多R2016b比R2016a。这是一个最小的例子:

r = rand(50,100); 
s = rand(100,100); 
tic; r * s; toc 

这大约需要0.0012s在R2016a和0.018s R2016b。

创造一个人工的循环,以确保这不只是一些初步的开销什么的导致同样的损耗因子:

tic; for i = 1:1000, a = r*s; end, toc 

这需要在R2016a约0.18s和2.1s时R2016b。

一旦我使矩阵变得更大,比如说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 
+3

我怀疑只有MathWorks才能完全回答这个问题。但是,我建议使用'timeit'来精确测量执行时间,特别是对于小型计算。 – horchler

+0

我同意我的观点,即MathWorks是可以回答的主要人员。我刚才问了Matlab Central。感谢'timeit'建议 - 结果与上面的'tic' /'toc'一致。 – adalca

+0

刚刚在MacOS X上试过这个,无法确认... – zeeMonkeez

回答

0

我收到了mathworks的更新。

据我了解,他们说这是Windows内存管理器的错误,它以相当分散的方式将内存分配给大单元阵列。由于(不相关的)乘法需要内存(对于输出),由于单元造成的内存碎片,现在获取这块内存需要更长的时间。 Linux(经测试)不存在此问题。