2016-10-12 9 views
0

私は複雑さO(n^3)でMATLABにコードを書いた。ループの1つを削除し、代わりにベクトル化されたフォームを使用しました。その結果、実行時間が減少しました。私はベクトル化が一般的に性能を向上させることを理解しています。私がよく分からないことは、ベクトル化が複雑さを変えないと仮定したことです。ベクトル化は複雑さを変化させますか?

次のように私はいくつかの実験をしました:

私は(私は8倍程度によって期待される)2倍2.5倍程度増加し、実行時間を入力サイズを増加させたとき。

私は最初の仮定(ベクトル化が複雑さを変えない)が有効かどうかはわかりません。誰にも洞察がありますか?

ありがとうございます。

+0

使用する機能によって異なります。例えば、 'bsxfun'のような関数を使うと、速度が' C++ '/' mex'ファイルとして書かれた 'for-loop'の間に増加します。そのような場合、私はコードをベクトル化することは複雑さを変えるとは思わない。 – NKN

+0

あなたの洞察に感謝します。実行時間が比例して増加しない理由を知っていますか(入力サイズが大きくなった場合)? forループを使用した場合、予想される増加に近づいていましたが、ベクトル化したときにはそれは近くにありませんでした。私はMATLABを使用しました。私はちょうど(列ではなく)索引を付けてforループを削除しました://www.mathworks.com/help/matlab/matlab_prog/vectorization.html – Crimson

+0

@Crimsonベクトル化されたアプローチでは、もっと処理していますデータの転送には時間がかかりますので、メモリの帯域幅などの影響を受ける可能性のあるデータ転送量がさらに増えます。したがって、リニアスケールとは思わないでしょう。ベクトル化vsパフォーマンスvsメモリはユニークなゲームです。私はあまりにも複雑な定義に精通していません。 – Divakar

答えて

0

私は非常に一般的な方法では、実際にはスループット(待ち時間)と操作の数(複雑さ)の違いだと思います。アルゴリズムのための非常に専用の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などの操作ごとにいくつかの余分なオーバーヘッドを持っています操作が意味をなすかどうかをチェックして、ループの速度を大幅に遅くします。しかし、これは一般的に傾向を説明するための一例に過ぎません。

+0

この説明で私が誤解されていないならば、アルゴリズムの並列バージョンのほとんどは複雑さが少ないので、複雑さは減少します。 – Crimson

+0

あなたの答えをありがとう。私が誤解していないかどうかを説明すると、複雑さは減少します(アルゴリズムの並列バージョンは通常複雑さが少ないため)。ベクトル化のマニュアルでは、並列化の説明はありませんでした。 – Crimson

+0

複雑さは主にO(n^3)でも同じですが、@Andrasが示唆しているようにいくつかの異なる要素があります。変更されるのは、一部の操作が並行して実行されるため、応答を得るための時間が短縮されることです。複雑さのベクトル化とは、並列操作を意味します。 一般に、「時間」は、複雑さを示す必要はなく、むしろ波打つ。特にMATLABの場合。 – mpaskov

関連する問題