主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

MATLABプロファイラーを使用した墨西哥人関数のプロファイリング

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

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

墨西哥人プロファイルの生成

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

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

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

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

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

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

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

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

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

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

    別のウィンドウが開き,プロファイル概要レポートが表示されます。

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

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

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

    包含行号、代码、单元格、总时间(秒)、时间百分比和示例代码中相关数据项的时间图字段的表。重要的是要指出编码器的总时间。Ceval相对较高。

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

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

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

    与上面提到的图像相同,这里是编码器。Ceval的总时间减少了0.653s。

墨西哥人コードカバレッジに対する式の畳み込みの効果

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関数と異なるものになる要因です。

参考

|||||

関連するトピック