MATLABプロファ▪▪ラ▪を使用したmex関数のプロファ▪▪リング
MATLAB®编码器™によって生成された墨西哥人関数の実行時間をMATLABプロファイラーを使用してプロファイリングできます。生成コードのプロファイルには,呼び出し回数および対応するMATLAB関数の各行に要した時間が表示されます。最も時間がかかる生成コードを生み出したMATLABコードの行を特定するには,プロファイラーを使用します。この情報は,開発サクルの初期段階でパフォマンスの問題を特定して修正するのに役立ます。Matlabプロファいては,配置文件
とパフォマンス向上のためのコドのプロファリングを参照してください。
プロファラへのグラフィカルなンタフェスはMATLAB在线™ではサポ,トされていません。
墨西哥プロファ苹果苹果ルの生成
生成されたmex関数でmatlabプロファ@ @ラ@ @を使用することができます。あるいは,MATLAB関数を呼び出すテストファイルがある場合は,墨西哥人関数の生成とプロファイリングを1ステップで実行できます。これらの操作は,コマンドラ,计算器ンまたはMATLAB编码器アプリで実行できます。
生成されたmex関数でプロファラを使用するには,以下を実行します。
構成オブジェクトプロパティ
EnableMexProfiling
を真正的
に設定することで,mexプロファ超市リングを有効にします。代わりに,
配置文件
オプションを指定してcodegen
を使用することもできます。MATLAB编码器アプリでの同等の設定は,[生成]ステップの[実行プロファ电子邮箱リングを有効にする]です。
墨西哥ファ苹果苹果ル
MyFunction_mex
を生成します。Matlabプロファ。
配置文件在;MyFunction_mex;配置文件查看器;
元のmatlabファescル
MyFunction.m
を変更または移動させていないことを確認します。変更または移動させていた場合,プロファ@ @ @はプロファ@ @ @ @ @ @ @MyFunction_mex
を考慮しません。
Matlab関数を呼び出すテストファescルMyFunctionTest.m
がある場合は,以下を実行できます。
以及
オプションと配置文件
オプションを指定したcodegen
を使用して,mex関数の生成とプロファaaplリングを1ステップで実行できます。以前にMATLABプロファイラーをオンにしていた場合は,これら2つのオプションを一緒に使用する前にオフにします。codegenMyFunction以及MyFunctionTest配置文件
アプリの[検証]ステップの[実行プロファ电子邮箱リングを有効にする]を選択することで,mex関数をプロファ超市リングします。以前にmatlabプロファラをオンにしていた場合は,この操作を実行する前にオフにします。
例
プロファイラーを使用して,最も時間がかかる生成コードを生み出す関数またはMATLABコードの行を特定します。入力行列一个
およびB
の表現を行優先から列優先のレaapl . exeアウトに1行で変換するmatlab関数の例を以下に示します。大規模な行列の場合は,こうした変換の実行に長い時間を要します。特定の行を変更して変換を回避することで,関数の効率性が向上します。
以下のmatlab関数にいて考えます。
函数[y] = MyFunction(A,B)% # codegen生成的代码使用矩阵A和B的行主表示coder.rowMajor;长度= size(A,1);遍历A和B的所有元素的绝对值之和%逐行矩阵Sum_abs = 0;为Row = 1:长度为col = 1:长度sum_abs = sum_abs + abs(A(行,col)) + abs(B(行,col));结束结束调用外部C函数'foo.c',返回所有元素的和A和B的%Sum = 0;Sum = code .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;双和= 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
のmexコ,ドを生成します。2の大規模な乱数行列一个
とB
に対してMyFunction_mex
を実行します。プロファ▪▪ル概要レポ▪▪トを確認します。A =兰特(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
を使用することで,この変換を回避することができます。Sum = code .ceval(“布局:rowMajor”,“foo”coder.ref (A), coder.ref (B),长度);
変更した
MyFunction
を使用して,mex関数とプロファ超市ルを再度生成します。A =兰特(20000);B =兰特(20000);codegenMyFunctionarg游戏{A、B}foo.cfoo。配置文件配置文件在;MyFunction_mex (A, B);配置文件查看器;
MyFunction
のプロファル詳細レポトは,coder.ceval
を呼び出す行にかかる時間がわずか0.653秒になったことを示しています。
Mexコ,ドカバレッジに対する式の畳み込みの効果
coder.const
を使用して式を定数に畳み込むとき,MATLAB関数と墨西哥人関数の間のコードカバレッジに差異が生じます。たとえば,以下の関数にいて考えます。
函数y = MyFoldFunction% # codegenA = 1;B = 2;C = a + b;Y = 5 + code .const(c);结束
Matlab関数MyFoldFunction
をプロファ@ @リングすると,プロファ@ @ル詳細レポ@ @トにこのコ@ @ドカバレッジが表示されます。
しかし,mex関数MyFoldFunction_mex
をプロファ▪▪リングすると異なるコ▪▪ドカバレッジが表示されます。
コ,ド生成では式C = a + b
を定数に畳み込んでいるため,行2,3および4は生成コ,ドでは実行されません。
この例では,ユ,ザ,定義の式の畳み込みを使用します。コードジェネレーターは,生成コードのパフォーマンスを最適化するために,特定の式を自動的に畳み込む場合があります。こうした最適化も,mex関数のカバレッジがmatlab関数と異なるものになる要因です。
参考
配置文件
|codegen
|编码器。MexCodeConfig
|coder.rowMajor
|coder.ceval
|coder.const