最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

buildInstrumentedMex

ログ作成可能な計測機能を含んだコンパイル済み C コード関数の生成

説明

buildInstrumentedMex fcn -options は、MATLAB® ファイル fcn.m を MEX 関数に変換し、すべての名前付きの変数と中間変数の両方の最小値と最大値のログを作成する計測機能を有効にします。オプションで、名前付きの値、中間値および式の値すべての log2 ヒストグラムに対するインストルメント化を有効にできます。buildInstrumentedMex および fiaccel の一般的な構文とオプションは同じですが、buildIntstrumentedMexfi オブジェクトの制限がなく、'-coder' オプションをサポートします。

buildInstrumentedMex fcn_1... fcn_n -options -coder は、MATLAB 関数 fcn_1 から fcn_n を MEX 関数に変換し、すべての名前付きの変数と中間変数の両方の最小値と最大値のログを作成する計測機能を有効にします。複数のエントリポイント関数のための MEX 関数を生成するには '-coder' オプションが必要です。

入力引数

fcn, fcn_1... fcn_n

インストルメント化する MATLAB エントリポイント関数。エントリポイント関数はコード生成に適合していなければなりません。詳細は、MATLAB コードをコード生成に適したものにする (MATLAB Coder)を参照してください。

options

コンパイラ オプションの選択肢。buildInstrumentedMex では、構成オブジェクトを使用して指定されたオプションよりも、個々のコマンド ライン オプションが優先されます。コマンド ライン オプションが競合する場合は、最も右にあるオプションが優先されます。

-args example_inputs

すべての MATLAB 関数入力のサイズ、クラスおよび実数/複素数を定義します。example_inputs 内の値を使用してこれらのプロパティを定義します。example_inputs は MATLAB 関数と同じ数で同じ順序の入力を指定する cell 配列でなければなりません。

-coder

既定の Fixed-Point Designer™ 関数 fiaccel ではなく、MATLAB Coder™ ソフトウェアを使用して MEX ファイルをコンパイルします。このオプションによって fiaccel 制限が除外されるため、コード生成が十分サポートされるようになります。このオプションを使用するには、MATLAB Coder のライセンスを所有していなければなりません。

-config config_object

config_object に基づき、coder.mexconfig を使用して MATLAB 変数として定義される、MEX 生成パラメーターを指定します。以下に例を示します。

cfg = coder.mexconfig;

-d out_folder

生成されたファイルを out_folder で指定された絶対パスまたは相対パスに保存します。out_folder で指定されたフォルダーが存在しない場合、関数 buildInstrumentedMex はフォルダーを作成します。

フォルダーの場所を指定しない場合、buildInstrumentedMex は既定のフォルダー内にファイルを生成します。

fiaccel/mex/fcn. 

fcn はコマンド ラインで指定された MATLAB 関数の名前です。

フォルダー名にはアスタリスク (*)、疑問符 (?)、ドル記号 ($) およびシャープ記号 (#) は使用できません。

-g

最適化を無効にして、デバッグ モードで MEX 関数をコンパイルします。これを指定しない場合、buildinstrumentedMex は最適なモードで MEX 関数を生成します。

-global global_values

MATLAB ファイルのグローバル変数の初期値を指定します。コンパイルする関数でグローバル変数を初期化するために cell 配列 global_values 内の値を使用します。cell 配列には各グローバル変数の名前と初期値を指定しなければなりません。関数 buildInstrumentedMex を使用してコンパイルする前にグローバル変数を初期化しなければなりません。-global オプションを使用してグローバル変数に初期値を提供しない場合、buildInstrumentedMex は MATLAB グローバル ワークスペース内の変数をチェックします。初期値を指定しないと buildInstrumentedMex はエラーを生成します。

生成された MEX コードと MATLAB は、それぞれ独自のグローバル データのコピーをもっています。一貫性を維持するために、これらの 2 つが情報をやり取りするときには必ずそれらのグローバル データを同期しなければなりません。データを同期しないと、グローバル変数は異なるものになる可能性があります。

-histogram名前付きの値、中間値および式の値すべての log2 ヒストグラムを計算します。ヒストグラムの列がコード生成レポートの表に表示されます。
-I include_path

include_path をコード生成パスの先頭に追加します。

MATLAB コードを MEX コードに変換する際には、buildInstrumentedMex"最初に" コード生成パスを検索します。

-launchreport

コード生成レポートを生成して開きます。このオプションを指定しないと、エラー メッセージまたは警告メッセージが発生したり、または -report オプションを指定した場合にのみ、buildInstrumentedMex でレポートが生成されます。

-o output_file_name

output_file_name を基本名とし、プラットフォーム固有の拡張子を付けて、MEX 関数を生成します。

output_file_name にはファイル名を指定するかまたは既存のパスを含めることができます。

出力ファイル名を指定しないと、基本名は fcn_mex になります。これによって、元の MATLAB 関数と MEX 関数を実行して、結果を比較できます。

-O optimization_option

optimization_option の値に基づいて、生成される MEX コードを最適化します。

  • enable:inline — 関数インライン化を有効にします。

  • disable:inline — 関数インライン化を無効にします。

これを指定しないと、buildInstrumentedMex ではインライン化を使用して最適化が行われます。

-report

コード生成レポートを生成します。このオプションを指定しないと、buildInstrumentedMex では、エラー メッセージまたは警告メッセージが発生した場合または -launchreport オプションを指定した場合にのみ、レポートが生成されます。

インストルメント化した MEX 関数の作成

インストルメント化した MEX 関数を作成します。テスト ベンチを実行し、次にログに記録された結果を表示します。

  1. 一時ディレクトリを作成し、サンプル関数を Fixed-Point Designer からインポートします。

    tempdirObj=fidemo.fiTempdir('buildInstrumentedMex')
    copyfile(fullfile(matlabroot,'toolbox','fixedpoint',...
       'fidemos','fi_m_radix2fft_withscaling.m'),...
       'testfft.m','f')
  2. プロトタイプの入力引数を定義します。

    n = 128;
    x = complex(zeros(n,1));
    W = coder.Constant(fidemo.fi_radix2twiddles(n));
  3. インストルメント化した MEX 関数を生成します。-o オプションを使用して、MEX 関数名を指定します。-histogram オプションを使用してヒストグラムを計算します。(MATLAB Coder ライセンスを所有している場合、-coder オプションも追加できます。この場合、次のコード行ではなく、buildInstrumentedMex testfft -coder -o testfft_instrumented -args {x,W} を使用します)。

    メモ

    fiaccel と同じように、buildInstrumentedMex も MEX 関数を生成します。C コードを生成するには、MATLAB 関数「Codercodegen」を参照してください。

    buildInstrumentedMex testfft -o testfft_instrumented...
    -args {x,W} -histogram
  4. テスト ファイルを実行し、インストルメント化の結果を記録します。showInstrumentationResults を呼び出してレポートを開きます。レポート内の変数の上で一時停止して、シミュレーションの最小値と最大値および 0 または正の整数ステータスを表示します。倍精度数に推奨されるデータ型もテーブルで参照できます。

    for i=1:20
       y = testfft_instrumented(randn(size(x)));
    end
    
    showInstrumentationResults testfft_instrumented

  5. [変数] タブの をクリックして変数のヒストグラムを表示します。

    この図の詳細については、NumericTypeScope のリファレンス ページを参照してください。

  6. ヒストグラムの表示を閉じて、結果ログをクリアします。

    clearInstrumentationResults testfft_instrumented;
  7. MEX 関数をクリアし、次に一時ファイルを削除します。

    clear testfft_instrumented;
    tempdirObj.cleanUp;

複数のエントリポイント関数のためにインストルメント化された MEX 関数のビルド

ローカルの書き込み可能なフォルダーで関数 ep1.m および ep2.m を作成します。

function y1 = ep1(u) %#codegen
y1 = u;
end 
function y2 = ep2(u, v) %#codegen
y2 = u + v;
end

2 つのエントリポイント関数のためにインストルメント化された MEX 関数を生成します。-o オプションを使用して、MEX 関数の名前を指定します。-histogram オプションを使用してヒストグラムを計算します。関数 buildInstrumentedMex-coder オプションを使用して、複数のエントリポイントを生成します。

u = 1:100;
v = 5:104;
buildInstrumentedMex -o sharedmex ...
ep1 -args {u} ... % Entry point 1
ep2 -args {u, v} ... % Entry point 2
-histogram -coder

生成された MEX 関数を使用して最初のエントリポイント関数を呼び出します。

y1 = sharedmex('ep1', u);

生成された MEX 関数を使用して 2 番目のエントリポイント関数を呼び出します。

y2 = sharedmex('ep2', u, v);

計測結果を表示します。

showInstrumentationResults sharedmex 

メモ

関数 buildInstrumentedMex を使用して複数のエントリポイント関数のための MEX 関数を生成するには、MATLAB Coder ライセンスが必要です。

ヒント

  • ソフトウェアに付属の MATLAB 関数はインストルメント化できません。最上位の関数がそのような MATLAB 関数の場合、ログには何も含まれません。また、スクリプトもインストルメント化できません。

  • 計測結果は、インストルメント化した MEX 関数が呼び出されるたびに累積されます。clearInstrumentationResults を使用して、ログの前回の結果をクリアします。

  • コーディング パターンによっては膨大なデータが渡されますが、使用されるデータはその一部です。そのような場合、buildInstrumentedMex の使用時にパフォーマンスの低下が確認される可能性もあります。次のパターンでは、subfun は入力配列の 1 要素 A しか使用しません。通常の実行では、subfun を 1 回実行する時間は A のサイズにかかわらず一定です。つまり、関数 topfunsubfunN 回呼び出すと、topfun の合計実行時間は N に比例します。ただし、インストルメント化されると、subfun を 1 回実行する時間は N^2 に比例するようになります。これは、最小データと最大データが配列全体に対して計算されるためです。A が大きいと、この計算でパフォーマンスの大幅な低下が発生する場合があります。そのため、可能な限り、関数が実際に必要とするデータのみを渡すようにしてください。

    function A = topfun(A)
        N = numel(A);
        for i=1:N
            A(i) = subfun(A,i);
        end
    end
    function b = subfun(A,i)
        b = 0.5 * A(i);
    end
      
    function A = topfun(A)
        N = numel(A);
        for i=1:N
            A(i) = subfun(A(i));   
        end  
    end
    function b = subfun(a)
        b = 0.5 * a;
    end
    

R2011b で導入