主要内容

MATLABプロファ▪▪ラ▪を使用したmex関数のプロファ▪▪リング

MATLAB®编码器™によって生成された墨西哥人関数の実行時間をMATLABプロファイラーを使用してプロファイリングできます。生成コードのプロファイルには,呼び出し回数および対応するMATLAB関数の各行に要した時間が表示されます。最も時間がかかる生成コードを生み出したMATLABコードの行を特定するには,プロファイラーを使用します。この情報は,開発サクルの初期段階でパフォマンスの問題を特定して修正するのに役立ます。Matlabプロファいては,配置文件パフォマンス向上のためのコドのプロファリングを参照してください。

プロファラへのグラフィカルなンタフェスはMATLAB在线™ではサポ,トされていません。

墨西哥プロファ苹果苹果ルの生成

生成されたmex関数でmatlabプロファ@ @ラ@ @を使用することができます。あるいは,MATLAB関数を呼び出すテストファイルがある場合は,墨西哥人関数の生成とプロファイリングを1ステップで実行できます。これらの操作は,コマンドラ,计算器ンまたはMATLAB编码器アプリで実行できます。

生成されたmex関数でプロファラを使用するには,以下を実行します。

  1. 構成オブジェクトプロパティEnableMexProfiling真正的に設定することで,mexプロファ超市リングを有効にします。

    代わりに,配置文件オプションを指定してcodegenを使用することもできます。

    MATLAB编码器アプリでの同等の設定は,[生成]ステップの[実行プロファ电子邮箱リングを有効にする]です。

  2. 墨西哥ファ苹果苹果ルMyFunction_mexを生成します。

  3. 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が行優先のレ▪▪アウトまたは列優先のレ▪▪アウトで表現されるかどうかに影響されません。MyFunctionsum_abs总和の差を返します。

大規模な入力行列一个BMyFunctionのパフォ,マンスを測定してから,それをさらに最適化できます。

  1. 墨西哥プロファ电子邮箱リングを有効にして,MyFunctionのmexコ,ドを生成します。2の大規模な乱数行列一个Bに対してMyFunction_mexを実行します。プロファ▪▪ル概要レポ▪▪トを確認します。

    A =兰特(20000);B =兰特(20000);codegenMyFunctionarg游戏{A、B}foo.cfoo。配置文件配置文件;MyFunction_mex (A, B);配置文件查看器

    別のウィンドウが開き,プロファ。

    概要概要显示了一个表字段函数名称调用,总时间(秒),自我时间(秒)和总时间图。有一个火焰图,表示柱状图中的表格。

    プロファイル概要レポートには墨西哥人ファイルとその子(元のMATLAB関数の生成コード)の合計時間と自己時間が表示されます。

  2. [関数名]で最初のリンクをクリックし,MyFunctionの生成コドのプロファル詳細レポトを表示します。最も時間がかかった行を確認できます。

    表与字段行号,代码,单元格,总时间(秒),百分比的时间和时间绘图与相关数据条目从示例代码。重要的是要指出编码器的总时间。西瓦尔相对较高。

  3. coder.cevalを呼び出す行に時間がかかっています(16.914秒)。この行の実行にかなりの時間を要したのは,外部のc関数に渡す前に,coder.cevalが行列一个Bの表現を行優先のレ▪▪アウトから列優先のレ▪▪アウトに変換するためです。coder.cevalで追加の引数布局:rowMajorを使用することで,この変換を回避することができます。

    Sum = code .ceval(“布局:rowMajor”“foo”coder.ref (A), coder.ref (B),长度);
  4. 変更したMyFunctionを使用して,mex関数とプロファ超市ルを再度生成します。

    A =兰特(20000);B =兰特(20000);codegenMyFunctionarg游戏{A、B}foo.cfoo。配置文件配置文件;MyFunction_mex (A, B);配置文件查看器
    MyFunctionのプロファル詳細レポトは,coder.cevalを呼び出す行にかかる時間がわずか0.653秒になったことを示しています。

    与上面提到的图片相同,这里是编码器。西瓦尔的总时间减少了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関数と異なるものになる要因です。

参考

|||||

関連するトピック