このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
MATLAB®编码器™によって生成された墨西哥人関数の実行時間をMATLABプロファイラーを使用してプロファイリングできます。生成コードのプロファイルには,呼び出し回数および対応するMATLAB関数の各行に要した時間が表示されます。最も時間がかかる生成コードを生み出したMATLABコードの行を特定するには,プロファイラーを使用します。この情報は,開発サイクルの初期段階でパフォーマンスの問題を特定して修正するのに役立ちます。MATLABプロファイラーの詳細については,関数配置文件
とパフォーマンス向上のためのコードのプロファイリングを参照してください。
プロファイラーへのグラフィカルなインターフェイスはMATLAB在线™ではサポートされていません。
生成された墨西哥人関数でMATLABプロファイラーを使用することができます。あるいは,MATLAB関数を呼び出すテストファイルがある場合は,墨西哥人関数の生成とプロファイリングを1ステップで実行できます。これらの操作は,コマンドラインまたはMATLAB编码器アプリで実行できます。
生成された墨西哥人関数でプロファイラーを使用するには,以下を実行します。
構成オブジェクトプロパティEnableMexProfiling
を真正的
に設定することで,墨西哥人プロファイリングを有効にします。
代わりに,配置文件
オプションを指定してcodegen
を使用することもできます。
MATLAB编码器アプリでの同等の設定は,[生成]ステップの(実行プロファイリングを有効にする]です。
墨西哥人ファイルMyFunction_mex
を生成します。
MATLABプロファイラーを実行し,別のウィンドウで開くプロファイル概要レポートを表示します。
配置文件在;MyFunction_mex;配置文件查看器;
元のMATLABファイルMyFunction.m
を変更または移動させていないことを確認します。変更または移動させていた場合,プロファイラーはプロファイリングでMyFunction_mex
を考慮しません。
MATLAB関数を呼び出すテストファイルMyFunctionTest.m
がある場合は,以下を実行できます。
以及
オプションと配置文件
オプションを指定したcodegen
を使用して,墨西哥人関数の生成とプロファイリングを1ステップで実行できます。以前にMATLABプロファイラーをオンにしていた場合は,これら2つのオプションを一緒に使用する前にオフにします。
codegenMyFunction以及MyFunctionTest配置文件
アプリの[検証]ステップの(実行プロファイリングを有効にする]を選択することで,墨西哥人関数をプロファイリングします。以前にMATLABプロファイラーをオンにしていた場合は,この操作を実行する前にオフにします。
プロファイラーを使用して,最も時間がかかる生成コードを生み出す関数またはMATLABコードの行を特定します。入力行列一个
およびB
の表現を行優先から列優先のレイアウトに1行で変換するMATLAB関数の例を以下に示します。大規模な行列の場合は,こうした変換の実行に長い時間を要します。特定の行を変更して変換を回避することで,関数の効率性が向上します。
以下のMATLAB関数について考えます。
函数[y] = MyFunction (A, B)% # codegen生成的代码使用矩阵A和B的行主表示coder.rowMajor;长度=大小(1);通过遍历A和B中所有元素的绝对值求和一行一行的%矩阵sum_abs = 0;为行= 1:长度为col = 1:length sum_abs = sum_abs + abs(A(row,col)) + abs(B(row,col));结束结束%调用外部C函数'foo.c',返回所有元素的和A和B的百分比金额= 0;和= coder.ceval (“foo”coder.ref (A), coder.ref (B),长度);%返回sum_abs和sum的差值Y = sum_abs - sum;结束
この関数の生成コードでは,正方行列一个
およびB
の行優先の表現を使用します。コードでは最初に,行列を行ごとに移動することでsum_abs
(一个
とB
のすべての要素の絶対値の合計)を計算します。このアルゴリズムは,行優先のレイアウトで表現される行列向けに最適化されています。次に,コードではcoder.ceval
を使用して外部のC関数foo.c
を呼び出します。
#include#include #include "foo.h" double foo(double *A, double *B, double length) {int i,j,s;Double sum = 0;s = (int)长度;/*求和A和B的所有元素*/ for(i=0;i
対応するCヘッダーファイルfoo。
は以下の通りです。
#include "rtwtypes.h" double foo(double *A, double *B, double length);
foo.c
は変数总和
を返します。この変数は,一个
とB
のすべての要素の合計です。関数foo.c
のパフォーマンスは,行列一个
とB
が行優先のレイアウトまたは列優先のレイアウトで表現されるかどうかに影響されません。MyFunction
はsum_abs
と总和
の差を返します。
大規模な入力行列一个
とB
のMyFunction
のパフォーマンスを測定してから,それをさらに最適化できます。
墨西哥人プロファイリングを有効にして,MyFunction
の墨西哥人コードを生成します。2つの大規模な乱数行列一个
とB
に対してMyFunction_mex
を実行します。プロファイル概要レポートを確認します。
一个=兰德(20000);B =兰德(20000);codegenMyFunctionarg游戏{A、B}foo.cfoo。配置文件配置文件在;MyFunction_mex (A, B);配置文件查看器;
別のウィンドウが開き,プロファイル概要レポートが表示されます。
プロファイル概要レポートには墨西哥人ファイルとその子(元のMATLAB関数の生成コード)の合計時間と自己時間が表示されます。
[関数名]で最初のリンクをクリックし,MyFunction
の生成コードのプロファイル詳細レポートを表示します。最も時間がかかった行を確認できます。
coder.ceval
を呼び出す行に時間がかかっています(16.914秒)。この行の実行にかなりの時間を要したのは,外部のC関数に渡す前に,coder.ceval
が行列一个
とB
の表現を行優先のレイアウトから列優先のレイアウトに変換するためです。coder.ceval
で追加の引数布局:rowMajor
を使用することで,この変換を回避することができます。
和= coder.ceval (“布局:rowMajor”,“foo”coder.ref (A), coder.ref (B),长度);
変更したMyFunction
を使用して,墨西哥人関数とプロファイルを再度生成します。
一个=兰德(20000);B =兰德(20000);codegenMyFunctionarg游戏{A、B}foo.cfoo。配置文件配置文件在;MyFunction_mex (A, B);配置文件查看器;
MyFunction
のプロファイル詳細レポートは,coder.ceval
を呼び出す行にかかる時間がわずか0.653秒になったことを示しています。
coder.const
を使用して式を定数に畳み込むとき,MATLAB関数と墨西哥人関数の間のコードカバレッジに差異が生じます。たとえば,以下の関数について考えます。
函数y = MyFoldFunction% # codegen= 1;b = 2;C = a + b;Y = 5 + code .const(c);结束
MATLAB関数MyFoldFunction
をプロファイリングすると,プロファイル詳細レポートにこのコードカバレッジが表示されます。
しかし,墨西哥人関数MyFoldFunction_mex
をプロファイリングすると異なるコードカバレッジが表示されます。
コード生成では式C = a + b
を定数に畳み込んでいるため,行2、3および4は生成コードでは実行されません。
この例では,ユーザー定義の式の畳み込みを使用します。コードジェネレーターは,生成コードのパフォーマンスを最適化するために,特定の式を自動的に畳み込む場合があります。こうした最適化も,墨西哥人関数のカバレッジがMATLAB関数と異なるものになる要因です。
codegen
|coder.ceval
|coder.const
|编码器。MexCodeConfig
|coder.rowMajor
|配置文件