私はこれを読みましたが、ベクトル化されたコードがなぜ速いのかまだわかりません。
forループでは、並列計算にparfortoを使用できます。ベクトル化されたコードの方が速い場合、それは自動的に並列化されることを意味しますか?
私はこれを読みましたが、ベクトル化されたコードがなぜ速いのかまだわかりません。
forループでは、並列計算にparfortoを使用できます。ベクトル化されたコードの方が速い場合、それは自動的に並列化されることを意味しますか?
いいえ。2つの重要な概念を混ぜ合わせています。
たとえば、次のような些細なケースを考えてみましょう。
s=0;
for i=1:length(v),
s = s+v(i);
end
と
sum(v)
おそらく、ticとtocを使用して、これら2つの関数の時間を計り、実行時の違いを理解する必要があります。ベクトルを操作する同様の一般的に使用される関数は約10あります。例はbsxfun
、、、、repmat
です。ベクトル化は、MATLABを効果的に使用するための標準的な部分です。コードを効果的にベクトル化できるようになるまでは、MATLABの世界では市民ではなく観光客にすぎません。length
find
多くの場合、parforは多くの場合に役立ちますが、非常に大きなゲインを得るためにparforできるタイプのループはめったに発生しません。
私は彼の答えについて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ループは、それ以外の場合は優れた解決策である問題に対するものであったため、恐れることはありません。ただし、多くの場合、適切にベクトル化されたコードは、単純でエラーが発生しにくく、同時に高速であることがよくあります。
最近のコンピューターでは、レジスター(数学などで使用される一時メモリー)には多くのビットがあり、複数の数値を一緒に操作できます。たとえば、データがuint8(8ビット)の場合、1つのCPUクロックでそれぞれに数値を追加したり、レジスタに8つをまとめて、1つのCPUクロックですべてに数値を追加したりできます。 。このようにして、forループの8倍の速度で作業できます。
これはある意味で並列化ですが、parforとは異なります。ParforはCPUの複数のコアを使用し、上記の方法では1つのコアがより効率的に使用されます。両方を使用すると、さらに高速化できます。