24

私はこれを読みましたが、ベクトル化されたコードがなぜ速いのかまだわかりません。

forループでは、並列計算にparfortoを使用できます。ベクトル化されたコードの方が速い場合、それは自動的に並列化されることを意味しますか?

4

3 に答える 3

20

いいえ。2つの重要な概念を混ぜ合わせています。

  • MATLABは、ベクトル演算を非常に高速に実行するように設計されています。MATLABはインタプリタ言語であるため、ループが非常に遅くなります。MATLABは、ベクトルを操作するための非常に高速な(通常はCで記述され、特定のアーキテクチャ用に最適化された)関数と十分にテストされた関数を提供することにより、この問題を回避します。ここには本当に魔法はありません。それはただのハードワークの束であり、長年にわたる絶え間ない小さな改善です。

たとえば、次のような些細なケースを考えてみましょう。

s=0;
for i=1:length(v),
    s = s+v(i);
end

sum(v)

おそらく、ticとtocを使用して、これら2つの関数の時間を計り、実行時の違いを理解する必要があります。ベクトルを操作する同様の一般的に使用される関数は約10あります。例はbsxfun、、、、repmatです。ベクトル化は、MATLABを効果的に使用するための標準的な部分です。コードを効果的にベクトル化できるようになるまでは、MATLABの世界では市民ではなく観光客にすぎません。lengthfind

  • MATLABの最近のバージョンはparforを提供します。parforは特効薬ではなく、使用および誤用される可能性のあるツールです(上記の合計の例でparforを試してください)。すべてのforsをparforedできるわけではありません。parforは、ループの各反復が互いに独立しているタスク並列タイプの問題用に設計されています。これは、parfor-loopを使用するための重要な要件です。

多くの場合、parforは多くの場合に役立ちますが、非常に大きなゲインを得るためにparforできるタイプのループはめったに発生しません。

于 2012-12-26T06:27:13.867 に答える
16

私は彼の答えについてcarlosdcに同意します。ただし、リリース6.5以降のMatlabには、forループなどを高速化するためのJITコンパイラが含まれていることを覚えておくことが重要です。

百万の要素を含む合計の例を簡単にテストしたvところ、次の結果が得られました。

  • sum(v):4.3ミリ秒
  • for-loop version:16ミリ秒
  • for-loop version, no JIT:966ミリ秒

JITは、次のようにオンとオフを切り替えることができます。

feature accel off
feature accel on

コードをベクトル化することによる改善の要因4は、もちろんそれでも価値がありますが、forループは、それ以外の場合は優れた解決策である問題に対するものであったため、恐れることはありません。ただし、多くの場合、適切にベクトル化されたコードは、単純でエラーが発生しにくく、同時に高速であることがよくあります。

于 2013-01-02T20:53:30.947 に答える
2

最近のコンピューターでは、レジスター(数学などで使用される一時メモリー)には多くのビットがあり、複数の数値を一緒に操作できます。たとえば、データがuint8(8ビット)の場合、1つのCPUクロックでそれぞれに数値を追加したり、レジスタに8つをまとめて、1つのCPUクロックですべてに数値を追加したりできます。 。このようにして、forループの8倍の速度で作業できます。

これはある意味で並列化ですが、parforとは異なります。ParforはCPUの複数のコアを使用し、上記の方法では1つのコアがより効率的に使用されます。両方を使用すると、さらに高速化できます。

于 2012-12-26T09:27:22.600 に答える