旧タイトルは無関係の変数の乗算ランタイムに影響を与える: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
私はMathWorksだけがこの質問に完全に答えることができると考えています。しかし、私は実行時間を正確に測定するために、特に小さな計算のために 'timeit 'を使うことをお勧めします。 – horchler
私はMathWorksが答えられる主な人物であるということに同意します。私は今Matlab Centralで尋ねました。 'timeit'の提案をありがとう - 結果は上記の' tic/toc'と一貫しているようです。 – adalca
MacOS Xでこれを試したところ、確認できません... – zeeMonkeez