雲雀は高く空を舞い このページをアンテナに追加 RSSフィード

「ひよこは高く空を舞い」について

2007-02-12

パフォーマンスの高速化  パフォーマンスの高速化 - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク -  パフォーマンスの高速化 - 雲雀は高く空を舞い  パフォーマンスの高速化 - 雲雀は高く空を舞い のブックマークコメント

MATLAB の高速化とは

配列の型

高速化は、3次元より高い次元をもつ配列を除いて、すべてのMATLAB 配列型に適用されます。

ループに対して

for ステートメントによりコントロールされるループは、MATLAB の中で、つぎの場合に、より高速に実行されます。

  • for ループに対するインデックスが、スカラ値の範囲で設定されている。
  • for ループに中のコードが、サポートしているデータタイプや配列の型にのみ使われている。
  • forループの中のコードが、いくつかの関数をコールしている場合、これらが、組み込み関数である。

ループパフォーマンスは、ループの中のすべてのコードが、高速化に対して、必要条件を満たしている場合に、最適化されます。このような場合、MATLAB は、for や end ステートメントを含む、すべてのループの実行をスピードアップします。

条件文

if, elseif, while, switch ステートメントは、ステートメントの中で条件文がスカラ値を計算する場合に限り、高速に実行します。

配列サイズ

配列を取り扱うとき、MATLAB が実行するために必要なオーバヘッド量があります。大きい配列に対して、この量は、データを取り扱うために必要となる時間と比べると小さいものになります。しかし、小さい行列に対して、オーバヘッドは、割合が大きくなり、より意味をもつものになります。

高速化は、配列を取り扱うために必要なオーバヘッドの量を小さくすることになります。従って、より小さい配列を使ったプログラムを記述することで、スピードアップが図られます。

MATLAB が高速化できないもの

データタイプと配列の型

ある種のデータタイプ、3次元以上の配列も高速化されていません。

関数コール

他の関数(M-ファイル、または、MEX-ファイル)、または、サブ関数のコールは、高速化と言う表現では意味が少ないもので、MATLAB の中では、高速化に寄与しません。コールされた関数を作っているコードは、高速化としては改良されていますが、セルを構成するメカニズム的には、効果が少なくなるものです。

MATLAB 組み込み関数をオーバロードした関数:

オーバロードされた関数の実行は、M-ファイル、または、MEX-ファイルをコールする関数を含んでいるので、MATLAB の組み込み関数をオーバロードすることは、実行速度を落とすことになります。たとえば、タイプ char に対して、組み込み関数 eq をオーバロードする場合、等価なキャラクタとの比較は、高速化をサポートしている MATLAB の組み込みの eq を使うときに比べ遅くなります。

ライン上に複数の演算が存在する場合

ある環境の基で、ユーザのプログラムの中の一つのラインに複数の演算を含んでいる場合、速度は遅くなります。ここで示される例題の中で、最初の演算は、構造体配列を含み、高速化でサポートされていないものです。

x = a.name;   for k=1:10000, sin(A(k)), end;

MATLAB は、同時にすべてのラインを、連続的にコードを処理しているので、同じライン上に効率の良くない演算が存在すると高速化は行なわれません。これは、この例題の中で、for ループが、別々のライン上にある場合に得る高速化の恩恵を受けていないことを意味します。

データタイプ、または、変数の型の変更

ユーザのプログラムが、存在している変数のデータタイプ、または、配列の型を変更する場合、 MATLAB は、一時的に、そのコードの高速化プロセスを停止し、変更を処理します。

ページのファイルでのベクトル化と前もってのメモリの割り当て法

ループのベクトル
前もって、配列を割り当てる
MATLAB実行中に避けること
トラックバック - http://chick.g.hatena.ne.jp/allegro/20070212
テクノラティプロフィール