生成されたコードでの関数入力のデータ コピーの回避
同じ変数を入力と出力の両方に使用する MATLAB® 関数を書くことで、生成コード内のデータ コピーの数を減らすことができます。このコード パターンでは、コード ジェネレーターに変数を値ではなく参照で渡すよう指示します。これにより、生成コードのメモリ使用量と実行時間が削減されます。このコードの最適化は "参照パラメーターの最適化" と呼ばれます。
参照パラメーターの最適化の適用
変数 A
を使用して入力と出力の両方を表す MATLAB 関数 foo
を定義します。
function A = foo(A,B) %#codegen A = A * B; end
ソース MATLAB 関数で変数を入力と出力の両方として使用すると、コード ジェネレーターは、生成された C/C++ 関数でこの変数を参照渡しのパラメーターにマッピングします。たとえば、foo
に対して生成されたコードでは、入力パラメーター A
はポインターを使用して参照渡しされます。
...
/* Function Definitions */
void foo(double *A, double B)
{
*A *= B;
}
...
この最適化により、呼び出しサイトでデータを渡す際に入力が一時変数にコピーされなくなるため、メモリ使用量と実行時間が削減されます。この削減は、参照渡しされる変数が大きなデータ構造体の場合に特に大きくなります。
一方、foo
と同じ計算を実行するが新しい変数 y
を使用して出力を返す関数 foo2
を作成するとします。
function y = foo2(A,B) %#codegen y = A * B; end
生成されたコードでは、参照パラメーターの最適化が使用されません。入力を値渡しで行い、出力の値を返します。
...
/* Function Definitions */
double foo2(double A, double B)
{
return A * B;
}
...
定数入力の特別な動作
参照パラメーターの最適化は定数入力に適用されません。同じ変数が入力と出力の両方で、入力が定数の場合、コード ジェネレーターでは出力が個別の変数として扱われます。たとえば、関数 foo
について考えます。
function A = foo(A,B) %#codegen A = A * B; end
A
が定数値 2
をもつコードを生成します。
codegen -config:lib foo -args {coder.Constant(2) 3} -report
生成コードでは、定数変数 A
は省略され、非定数変数 B
は値渡しされて、出力は値で返されます。
...
/* Function Definitions */
double foo(double B)
{
return 2.0 * B;
}
...