web-dev-qa-db-ja.com

Matlabプログラムの実行を高速化する方法は?

MATLABコードをより速く実行するためのテクニックはありますか?

私は自分のPCをより速くすることができるものについて話している(PCのパフォーマンスを改善するためにいくつかの.exeやソフトウェアを停止するなど)。私のPCが同じタスクを2つの異なる時間で実行していることに気づきました。たとえば、彼は45秒でプログラムを実行でき、10分で同じプログラムを再度実行できます。

3
bzak

コンピューターで実行速度が遅いのはMATLABですか、それともMATLABで作成したプログラムですか?

MATLABは、動的なメモリ割り当てと再割り当てを多用します。行列または配列のサイズ変更は非常に遅く、非決定論的である可能性があります。マトリックスまたは配列が大きくなると、新しいメモリが割り当てられ、古いコピーを削除する前に既存のデータが新しいメモリにコピーされます。このような配列を事前に割り当てることで、このメモリスラッシングを回避できます。たとえば、次のコードです。

x = 0;
for k = 2:1000
   x(k) = x(k-1) + 5;
end

xは反復ごとにサイズ変更され、実行速度が非常に遅くなります。比較すると、次のコードです。

x = zeros(1, 1000);
for k = 2:1000
   x(k) = x(k-1) + 5;
end

サイズ変更が発生せず、実行速度が大幅に向上するように、配列を事前に割り当てます。

MathWorks Webサイトには ページ全体 これと他のパフォーマンス向上テクニックの詳細があります。このページの内容は次のとおりです。

  • 配列の事前割り当て
  • 大規模なデータセットに分散配列を使用する
  • 可能な場合は、forをparfor(Parallel for)に置き換えます
  • サイズと複雑さの制限
  • 変数への割り当て
  • 適切な論理演算子の使用
  • 組み込み関数のオーバーロード
  • 関数は一般的にスクリプトよりも高速です
  • ロードと保存はファイルI/O機能よりも高速です
  • ループのベクトル化
  • 大規模なバックグラウンドプロセスを回避する

提案したソリューションはMathWorksのリストの最後にあることに注意してください。仮想マシンの実行や、MATLABの実行と同時に高解像度ビデオの再生など、明らかにリソースを消費する何かをしている場合を除いて、他のすべてのポイントを最初に確認する必要があります。 、実行中の他のプロセスを見ると、おそらく小さなものに汗を流しています。

7
Clifford

Cliffordの提案に従った後、MATLABプロファイリングツールを使用して、プログラムがほとんどの時間を費やしている場所(通常は行や関数が多すぎない)を確認できます。次に、それらの行の最適化に焦点を合わせます。

3
Adrien

コードの実行時間が非常に変動する場合は、仮想メモリに集中していることがあるという問題が発生している可能性があります。 MATLABがスワップスペースを使用する必要がある場合、処理は劇的に遅くなります。結局のところ、物理RAMの可用性の代わりにディスクスペースを使用しています。これが、さまざまな実行にかかる時間の桁違いに時間的に変化するコードに対して私が提供できる最大の理由です。

プロファイラーツールを使用して、時間がどこに向かっているのかを判断します。それらの行を注意深く見てください。呼び出した関数で一時的に行われたとしても、大きな配列を作成していますか?

システムを確認してください。ディスクアクセスが多いときにCPUが基本的にアイドル状態で実行されている場合は、これが発生するかどうかを確認してください。

もちろん、これが私が提案するとおりであれば、解決策も論理的です。

  • メモリの観点からアルゴリズムをより効率的にします。これは常に良いことです。

  • 現在2GB未満の場合は、さらにRAMを取得してください。

  • より多くのRAMを取得するとともに、64ビットバージョンのMATLABを使用します。

3
woodchips

私によると、ディスクアクセスやメモリスワッピングの問題など、システム全体のリソースのボトルネックになっているはずです。 Process Explorer で何が表示されるかを確認してみてください。そこで、システムで何が起こっているかがわかる場合があります。

2
jdehaan