私は非常に一般的な方法では、実際にはスループット(待ち時間)と操作の数(複雑さ)の違いだと思います。アルゴリズムのための非常に専用のASICを構築する場合は、n^3回の演算を行う必要があります。ベクトル化することによって、これらの操作のいくつかは互いに独立して並行して実行できるということです。 Matlabと現在のプロセッサーはもっと巧妙で、特定の操作を '並列'で行うことができます。 64ビットプロセッサは2-32bit和を行うことができ4-16bitなど
各操作を行わなければならない2つのOの両方のアルゴリズム(N^3)、のだと思う完全に独立して(あなたはこのアルゴリズムをベクトル化することができます)と、 bもう1つはシリーズでなければなりません(ベクトル化できません)。それらのそれぞれのための特別なハードウェアはどちらもn^3操作を必要とします。しかし、のハードウェア/ゲートをにすると、1クロックサイクルで処理を完了することができます。bハードウェア/ゲートの数が増えれば、タスクはn^3クロックサイクルかかるでしょう。
EDIT:ベクトル化の速度を説明する
いくつかのコード、複雑(#operation)は
clear variable;
Iterations = 100;
n = 2^20;
a = randi(100,[1,n]);
b = randi(100,[1,n]);
profile on;
for loop=1:Iterations
% Full vector approach
vector = a*b.';
% Partial vector approach
vector2 = sum(a.*b);
% Direct mathematical approach
serial = 0;
for id=1:n
serial = serial + a(id)*b(id);
end
end
profile viewer;
を増加させないだろうが、今は技術的にMathWorks社のMATLABなどの操作ごとにいくつかの余分なオーバーヘッドを持っています操作が意味をなすかどうかをチェックして、ループの速度を大幅に遅くします。しかし、これは一般的に傾向を説明するための一例に過ぎません。
使用する機能によって異なります。例えば、 'bsxfun'のような関数を使うと、速度が' C++ '/' mex'ファイルとして書かれた 'for-loop'の間に増加します。そのような場合、私はコードをベクトル化することは複雑さを変えるとは思わない。 – NKN
あなたの洞察に感謝します。実行時間が比例して増加しない理由を知っていますか(入力サイズが大きくなった場合)? forループを使用した場合、予想される増加に近づいていましたが、ベクトル化したときにはそれは近くにありませんでした。私はMATLABを使用しました。私はちょうど(列ではなく)索引を付けてforループを削除しました://www.mathworks.com/help/matlab/matlab_prog/vectorization.html – Crimson
@Crimsonベクトル化されたアプローチでは、もっと処理していますデータの転送には時間がかかりますので、メモリの帯域幅などの影響を受ける可能性のあるデータ転送量がさらに増えます。したがって、リニアスケールとは思わないでしょう。ベクトル化vsパフォーマンスvsメモリはユニークなゲームです。私はあまりにも複雑な定義に精通していません。 – Divakar