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

グローバル データのためのコード生成

ワークフロー

グローバル データを使用する MATLAB® コードから C/C++ コードを生成するには、次の手順に従います。

  1. コード内で変数をグローバルとして宣言します。

  2. 使用する前に、グローバル データを定義し初期化します。

    詳細は、グローバル データの定義を参照してください。

  3. MATLAB Coder™ アプリまたは codegen を使用してコードを生成します。

グローバル データを使用する場合は、MATLAB と生成される MEX 関数の間でこのデータを同期するかどうかも指定しなければなりません。詳細は、グローバル データと MATLAB の同期を参照してください。

グローバル変数の宣言

グローバル データの使用時には、まず MATLAB コード内でグローバル変数を宣言しなければなりません。2 つのグローバル変数 ARB を使用する関数 use_globals を考えてみます。

function y = use_globals(u)
%#codegen
% Turn off inlining to make 
% generated code easier to read
coder.inline('never');
% Declare AR and B as global variables
global AR;
global B;
AR(1) = u + B(1);
y = AR * 2;

グローバル データの定義

グローバル データの定義は、MATLAB グローバル ワークスペース、MATLAB Coder プロジェクトまたはコマンド ラインのいずれでも行えます。プロジェクトまたはコマンド ラインでグローバル データを初期化しなかった場合は、MATLAB Coder は MATLAB グローバル ワークスペース内で変数を探します。変数が存在しない場合、MATLAB Coder はエラーを返します。

MATLAB グローバル ワークスペース内でのグローバル データの定義

codegen を使用して、グローバル変数の宣言で説明されている関数 use_globals の MEX 関数を生成するには、以下の手順に従います。

  1. MATLAB ワークスペースで、グローバル データの定義と初期化を行います。MATLAB プロンプトで、次のように入力します。

    global AR B;
    AR = ones(4);
    B = [1 2 3];
    

  2. MEX ファイルの生成

    codegen use_globals -args {0}
    % Use the -args option to specify that the input u
    % is a real, scalar, double
    % By default, codegen generates a MEX function,
    % use_globals_mex, in the current folder

MATLAB Coder アプリを使用したグローバル データの定義

  1. [入力の型を定義] ページで自動的に入力の型を定義するか、[入力またはグローバルの型を直接入力します] をクリックします。

    アプリにエントリポイント入力のテーブルが表示されます。

  2. グローバル変数を追加するには、[グローバルの追加] をクリックします。

    既定では、アプリはプロジェクト内の最初のグローバル変数には g、それに続くグローバル変数には g1g2 などと名前を付けます。

  3. [グローバル変数] の下に、グローバル変数の名前を入力します。

  4. グローバル変数名の右側のフィールドをクリックします。グローバル変数の型と初期値を指定します。アプリを使用したグローバル変数の型と初期値の指定を参照してください。

    型を指定しないと、グローバル ワークスペースに同じ名前の変数を作成しなければなりません。

コマンド ラインでのグローバル データの定義

コマンド ラインでグローバル データを定義するには、codegen -globals オプションを使用します。たとえば、グローバル変数の宣言で説明されている関数 use_globals をコンパイルするには、コマンド ラインで 2 つのグローバル入力 ARB を指定します。-args オプションを使用して、入力 u が実数の double スカラーであることを指定します。既定では、codegen は現在のフォルダーに MEX 関数 use_globals_mex を生成します。

codegen -globals {'AR',ones(4),'B',[1 2 3]} use_globals -args {0}

または、-globals フラグを使用し、-globals {'g', {type, initial_value}} の形式でデータ型と初期値を指定します。cell 配列では、この形式を使用しなければなりません。コマンド ラインでのグローバル cell 配列の指定を参照してください。

可変サイズのグローバル データの定義-  可変サイズのグローバル データの初期値を指定するには、-globals フラグを使用し、-globals {'g', {type, initial_value}} の形式でデータ型と初期値を指定します。たとえば、初期値 [1 1] と上限 [2 2] をもつグローバル変数 g1 を指定するには、次のように入力します。

codegen foo -globals {'g1', {coder.typeof(0, [2 2],1),[1 1]}}
この構文の詳細は、coder.typeof を参照してください。

グローバル データと MATLAB の同期

グローバル データを同期する理由

生成された MEX 関数と MATLAB は、それぞれ独自のグローバル データのコピーをもっています。これらのコピーの一貫性を維持するために、これらの 2 つが情報をやりとりするときには必ずそれらのグローバル データを同期しなければなりません。データを同期しないと、グローバル変数は異なるものになる可能性があります。グローバル データをいつ同期するかは、相互作用のレベルによって決まります。詳細は、グローバル データを同期するタイミングを参照してください。

グローバル データが定数の場合、グローバル データを MATLAB と同期することはできません。既定では、MEX 関数は関数のエントリ時と外部関数呼び出し後にコンパイル時の定数のグローバル値と MATLAB の値の整合性をテストします。MATLAB の値がコンパイル時の定数のグローバル値と異なる場合、MEX 関数はエラーで終了します。MEX 関数がコンパイル時の定数のグローバル値と MATLAB の値の整合性をテストする場合の制御についての詳細は、MATLAB と定数のグローバル データとの整合性を参照してください。

グローバル データを同期するタイミング

既定では、MEX 関数のエントリ時と終了時および外部呼び出し時に MEX 関数のグローバル データと MATLAB 間の同期が発生します。この同期方法を使用すると、MEX 関数と MATLAB の間で最大の一貫性を確保できます。

パフォーマンスを向上させるには、以下を行います。

  • MEX 関数の入口と出口でのみ同期するように選択します。

  • グローバル データが相互作用を行わないときは同期を無効にします。

  • 各外部呼び出しの前後で同期するかどうかを選択します。

以下の表に、グローバル データ同期オプションの使い方をまとめて示します。これらのオプションの設定方法については、グローバル データを同期する方法を参照してください。

グローバル データ同期オプション

実行する操作グローバル データ同期モードの設定値外部呼び出しの前後で同期する機能
すべての外部呼び出しがグローバル データを変更するときに最大の一貫性を得る。[MEX 関数エントリ時、終了時、および外部の呼び出し時] (既定値)あり。既定の動作。
ほとんどの外部呼び出しがグローバル データを変更し、一部が変更しないときに最大の一貫性を得る。[MEX 関数エントリ時、終了時、および外部の呼び出し時] (既定値)

あり。グローバル データを変更しない外部呼び出しに対しては、coder.extrinsic -sync:off オプションを使用して同期をオフにします。

ほとんどの外部呼び出しがグローバル データを変更することはなく、一部が変更するときに最大の一貫性を得る。[MEX 関数のエントリ時と終了時]

あり。グローバル データを変更する呼び出しのみを同期するように coder.extrinsic -sync:on オプションを使用します。

いずれの外部呼び出しもグローバル データを変更しないときのグローバル データの同期のパフォーマンスを最大化する。[MEX 関数のエントリ時と終了時]なし。
生成された MEX 関数間のみでやりとりする。MATLAB と MEX 関数のグローバル データ間の相互作用なし。[無効]なし。

グローバル データを同期する方法

グローバル データの同期をコントロールするには、グローバル データ同期モードを設定し、外部関数を同期するかどうかを選択します。どのオプションを使用するかのガイドラインについては、グローバル データを同期するタイミングを参照してください。

グローバル データ同期モードは、[プロジェクトの設定] ダイアログ ボックス、コマンド ラインまたは [MEX コンフィギュレーション] ダイアログ ボックスから制御できます。外部関数とのデータの同期を制御するには、coder.extrinsic -sync:on および -sync:off オプションを使用します。

MATLAB Coder アプリを使用したグローバル データ同期モードのコントロール

  1. [生成] ダイアログ ボックスを開くために、[コード生成] ページの [生成] 矢印 をクリックします。

  2. [ビルド タイプ][MEX] に設定します。

  3. [詳細設定] をクリックします。

  4. [メモリ] タブで、[グローバルなデータ同期モード] を場合に応じて [MEX 関数エントリ時と終了時] または [無効] に設定します。

コマンド ラインからのグローバル データ同期モードのコントロール

  1. MATLAB ワークスペースで、コード生成構成オブジェクトを定義します。MATLAB コマンド ラインで次のように入力します。

    mexcfg = coder.config('mex');

  2. MATLAB コマンド ラインで、状況に応じて GlobalDataSyncMethod プロパティを SyncAtEntryAndExits または NoSync に設定します。以下に例を示します。

    mexcfg.GlobalDataSyncMethod = 'SyncAtEntryAndExits';
    

  3. コードをコンパイルする場合は、mexcfg 構成オブジェクトを使用します。たとえば、入力のない関数 foo の MEX 関数を生成するには、次のように入力します。

    codegen -config mexcfg foo

外部関数呼び出しのための同期のコントロール-  外部関数を呼び出す前後に MATLAB と MEX 関数のグローバル データ間の同期が発生するかどうかを制御するには、coder.extrinsic-sync:on および -sync:off オプションを使用します。

既定では、グローバル データは以下のようになります。

  • グローバル データ同期モードが [MEX 関数エントリ時、終了時、および外部の呼び出し時] に設定されている場合は、各外部呼び出しの前後に同期されます。ある特定の外部呼び出しがグローバル データを変更しないことが分かっている場合は、-sync:off オプションを使用してこれらの呼び出しに対して同期を無効にしてください。たとえば、関数 foo1 と関数 foo2 がグローバル データを変更しない場合は、これらの関数に対して同期を無効にします。

    coder.extrinsic('-sync:off', 'foo1', 'foo2');

  • グローバル データ同期モードが [MEX 関数エントリ時と終了時] の場合は、同期されません。グローバル データを変更する外部呼び出しがいくつかコードにある場合は、-sync:on オプションを使用してこれらの呼び出しに対して同期を有効にしてください。たとえば、関数 foo1foo2 がグローバル データを変更する場合は、これらの関数に対して同期を有効にします。

    coder.extrinsic('-sync:on', 'foo1', 'foo2');

  • グローバル データ同期モードが [無効] の場合は同期されません。同期が無効になっているときは、-sync:on オプションを使用して特定の外部呼び出しに対して同期をコントロールすることはできません。

グローバル データのクリア

MEX 関数および MATLAB には、グローバル データの独自のコピーがそれぞれ存在するため、MEX の連続実行で必ず同じ結果が得られるように、clear を使用してどちらのコピーもクリアしなければなりません。clear global コマンドは、MATLAB ワークスペース内のグローバル データのみを削除します。両方のデータを削除するには、clear global コマンドと clear mex コマンドを一緒に使用します。clear all コマンドも両方を削除します。

定数のグローバル データの定義

グローバル変数の値が実行時に変化しないことがわかっている場合、グローバル変数が定数値をもつと指定することで生成コードのオーバーヘッドを減らすことができます。定数のグローバル変数には書き込みできません。

MATLAB Coder アプリを使用した定数のグローバル データの定義

  • [入力の型を定義] ページで自動的に入力の型を定義するか、[入力またはグローバルの型を直接入力します] をクリックします。

    アプリにエントリポイント入力のテーブルが表示されます。

  1. グローバル変数を追加するには、[グローバルの追加] をクリックします。

    既定では、アプリはプロジェクト内の最初のグローバル変数には g、それに続くグローバル変数には g1g2 などと名前を付けます。

  2. [グローバル変数] の下に、グローバル変数の名前を入力します。

  3. グローバル変数名の右側のフィールドをクリックします。

  4. [定数値の定義] を選択します。

  5. グローバル変数の右にあるフィールドに MATLAB 式を入力します。

コマンド ラインでの定数のグローバル データの定義

codegen コマンドを使用してグローバル変数に定数を指定するには、coder.Constant クラスと共に -globals オプションを使用します。

  1. 必要なコード生成出力タイプの構成オブジェクトを定義します。たとえば、MEX コードの生成用の構成オブジェクトを定義します。

    cfg = coder.config('mex');
    

  2. coder.Constant を使用してグローバル変数が定数値をもつことを指定します。たとえば、次のコードはグローバル変数 g が初期値 4 をもち、グローバル変数 gc42 をもつことを指定しています。

    global_values = {'g', 4, 'gc', coder.Constant(42)};
  3. -globals オプションを使用してコードを生成します。たとえば、グローバル変数は cell 配列 global_values で定義されることを指定する myfunction のコードを生成します。

    codegen -config cfg -globals global_values myfunction

MATLAB と定数のグローバル データとの整合性

既定では、生成された MEX 関数は MATLAB ワークスペース内の定数のグローバル データの値と、生成された MEX 内のコンパイル時の値との整合性を確認します。整合性のテストは、関数のエントリ時と外部関数呼び出し後に行われます。MEX 関数が不整合を検出すると、エラーで終了します。MEX 関数がいつ整合性をテストするかを制御するには、グローバル同期モードと coder.extrinsic 同期オプションを使用します。

次の表は、コンパイル時の定数のグローバル データ値と MATLAB との整合性を MEX 関数がいつ確認するか、グローバルなデータ同期モードと coder.extrinsic 同期オプションの設定がどのように決定するかを説明しています。

グローバルなデータ同期モード (プロジェクト)GlobalDataSyncMethod (MEX 構成オブジェクト)MEX 関数エントリ時に定数のグローバル値の整合性を確認coder.extrinsic 同期オプション外部関数呼び出し後に定数のグローバル値の整合性を確認

[MEX 関数エントリ時、終了時、および外部の呼び出し時] (既定値)

'SyncAlways'

はい

'sync:on' (既定)

はい

'sync:off'

いいえ

[MEX 関数のエントリ時と終了時]

'SyncAtEntryAndExits'

はい

'sync:on'

はい

'sync:off' (既定)

いいえ

[無効]

'NoSync'

いいえ

N/A

N/A

コード生成レポート内の定数のグローバル データ

コード生成レポートは定数のグローバル変数について以下の情報を提供します。

  • Global の型 ([変数] タブ内)。

  • 強調表示された変数名 ([関数] ペイン内)

MATLAB 変数を参照してください。

生成されたコードのグローバル データ制限

  • グローバル構造体変数には、ハンドル オブジェクトまたはスパース配列を含めることができません。

  • coder.cstructname はグローバル変数に直接適用できません。グローバル変数で使用する構造体型に名前を付けるには、coder.cstructname を使用して、構造体型に名前を付ける型オブジェクトを作成します。次に、codegen を実行するときに、グローバル変数にその型があることを指定します。グローバル構造体変数と共に使用するための C 構造体型の命名を参照してください。

参考

関連するトピック