0

次のコードがあります。

for i=1:N,
    some_mex_file();
end

私の MEX ファイルは次のことを行います。

  1. 私が定義したクラスのオブジェクトを宣言します。これは、2 つの大きなメモリ ブロック、つまり double 型の 32x2048x2 を持ちます。
  2. このオブジェクトのデータを処理します。
  3. オブジェクトを破棄します。

オブジェクトに大きなメモリ ブロックを割り当てるループ内で MEX ファイルを呼び出すと、さらに時間がかかるのではないかと考えています。オブジェクトを一度だけ宣言し、そのメモリ空間をリセットして、新しい宣言なしで何度でも使用できるように、C++ に移行することを考えていました。これは違いを生むのでしょうか、それとも価値のない努力になるのでしょうか? つまり、一度宣言して再利用するよりも、MEX ファイルにメモリを割り当てる方が時間がかかりますか?

4

1 に答える 1

1

したがって、ここでの通常のアドバイスが適用されます。コードをプロファイリングするか(MatlabとC / C ++プロファイラーの両方を使用)、少なくともデバッガーで数回停止して、どこで時間を費やしているかを確認します。どこで時間を費やしているのか「不思議に思う」のをやめ、実際にどこで時間を費やしているのかを測定します。

しかし、私はこのような問題に遭遇しました。MEX関数でのメモリの割り当て/割り当て解除が主要なパフォーマンスシンクです。ただし、これはプロファイリング(またはデバッガーでコードを停止)して確認する必要があります。

この種のパフォーマンスの問題に対する最も簡単な解決策は2つあります。

  1. ループをMEX関数に移動します。反復回数を指定してMEX関数を呼び出し、高速C /C++コードに実際にループを実行させます。これにより、MatlabからMEX関数(大きなNの場合はかなりの額になる可能性があります)を呼び出すコストがなくなり、2番目の最適化が容易になります。

  2. MEX関数に割り当て/割り当て解除をキャッシュさせます。これは、ループをMEX関数に移動した場合に、はるかに簡単(かつ安全)に実行できます。これはいくつかの方法で実行できますが、最も簡単なのは、スペースを1回(ループの外側で)割り当て、ループが完了したら割り当てを解除することです。

于 2012-07-03T18:27:41.417 に答える