2016-11-15 7 views
1

旧タイトルは無関係の変数の乗算ランタイムに影響を与える:R2016a *よりR2016bで *小行列の乗算はるかに遅い (以下更新)を大型ワークスペース変数は

私は小さな行列の掛け算をしてはるかに小さいようであることがわかりますR2016aよりR2016b。最小の例を以下に示します。

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)が得られます。

なぜ、ワークスペース内の変数が2つの小さな変数の行列乗算に影響するのですか?さらに、なぜ特定のタイプの変数を使用すると、ワークスペースが劇的に減速するのでしょうか。

ここでは、ワークスペース内のセルフォームの大きな変数が、行列乗算のランタイムまたは2つの無関係な行列に影響する例を示します。このセルをマトリックスに倒すと、その効果は消えてしまいます。

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(テスト済み)にはこの問題はありません。

関連する問題