メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

グローバル変数のコード生成

グローバル変数を使用する MATLAB® 関数の C/C++ コードと MEX 関数を生成できます。グローバル変数を使用する MATLAB コードの MEX 関数を実行すると、生成された関数と MATLAB にそれぞれ独自の変数のコピーが保持されます。それらのコピー間でデータを同期する方法を決めなければなりません。また、コード生成用の MATLAB コードでグローバル データを使用している場合、一定の制限が適用されます。

グローバル データを使用する MATLAB 関数のコードの生成

グローバル変数を使用する MATLAB 関数のコードを生成するときは、コード生成前かコード生成時に変数を定義して初期化する必要があります。コード生成時にグローバル変数が定義されていない場合、コード ジェネレーターは MATLAB グローバル ワークスペース内でグローバル変数を探します。グローバル変数が存在しない場合、コード生成は失敗します。

グローバル変数を使用する MATLAB 関数のコードを生成するには、次のいずれかの方法を使用します。

  • MATLAB Coder™ アプリまたは codegen コマンドを使用して、コード生成前に MATLAB グローバル ワークスペースでグローバル変数を定義および初期化する。

  • MATLAB Coder アプリの [エントリ ポイント] ペインでコード生成前にグローバル変数を定義して初期化する。

  • コマンド ラインで codegen コマンドを -globals オプション付きで使用してグローバル変数を定義および初期化する。

グローバル ワークスペースでのグローバル変数の定義と初期化

コード生成前に MATLAB グローバル ワークスペースでグローバル変数を定義および初期化するには、コマンド ラインで global 関数を使用します。以下に例を示します。

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

その後、MATLAB Coder アプリまたは codegen コマンドを使用してコードを生成します。グローバル変数について、それ以上の指定は必要ありません。

MATLAB Coder アプリでのグローバル変数の定義と初期化

MATLAB Coder アプリでグローバル変数を定義および初期化するには、[新規エントリ ポイント]、[新規グローバル] をクリックします。各グローバル変数の名前、型、および初期値を指定します。Define Global Variables in the MATLAB Coder Appを参照してください。その後、アプリを使用してコードを生成します。

codegen コマンドでのグローバル変数の定義と初期化

コマンド ラインで codegen コマンドを使用してコードを生成する場合は、コード生成時にグローバル変数を定義および初期化できます。-globals オプションを使用して、グローバル変数の名前と初期値の cell 配列を codegen コマンドに渡します。この cell 配列の形式は {global1,value1,global2,value2,...} です。以下に例を示します。

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

または、coder.typeof 関数を使用してグローバル変数の型を指定できます。この場合、-globals オプションに渡す cell 配列の形式は {global1,{type1,value1},global2,{type2,value2},...} です。以下に例を示します。

codegen use_globals -globals {"A",{coder.typeof(0,[4 4]),ones(4)},"B",{coder.typeof(0,[1 3]),[1 2 3]}} -args {0}

グローバル変数が cell 配列の場合は coder.typeof を使用する必要があります。コマンド ラインでのグローバル cell 配列の指定を参照してください。

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

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

定数のグローバル変数を定義するには、次のいずれかの方法を使用します。

  • コマンド ラインで、codegen コマンドの -globals オプションに渡す cell 配列で coder.Constant クラスを使用します。以下に例を示します。

    codegen use_globals -globals {"A",ones(4),"B",coder.Constant([1 2 3])} -args {0}
    

  • MATLAB Coder アプリで、[エントリ ポイント] ペインの [グローバル] セクションで変数をポイントし、[モードおよびアクション] ボタン をクリックします。[モード] セクションで [定数の使用] を選択します。

生成された MEX 関数と MATLAB の間でのグローバル データの同期

MEX 関数を生成して実行すると、生成された関数と MATLAB のそれぞれでグローバル データのコピーが保持されます。それらのコピーの一貫性を維持するために、MEX 関数と MATLAB が情報をやりとりするときにそれらのグローバル データを同期しなければなりません。データを同期しないと、グローバル変数は異なるものになる可能性があります。グローバル データを同期する頻度は、生成された関数でグローバル データがどの程度変更されるかによって決まります。

グローバル データを定数として定義している場合、生成された関数で使用されるグローバル データを MATLAB と同期することはできません。代わりに、生成された関数コード内の定数のグローバル変数と MATLAB グローバル ワークスペース内の変数で値が異なる場合、MEX 関数でエラーが生成されます。

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

既定では、MEX 関数の実行の開始時、MEX 関数の実行の終了時、および各外部関数呼び出しの後にグローバル データの同期が行われます。この動作により、生成された関数と MATLAB の間で最大の一貫性が得られますが、生成コードの関数のパフォーマンスが低下する可能性があります。

生成された関数と MATLAB の間でのグローバル データの同期は、構成パラメーター [グローバルなデータ同期モード] を使用して制御できます。個々の外部関数については、coder.extrinsic 関数の "-sync" 引数を使用してグローバル データの同期を制御できます。

次の表は、MEX 関数を生成する際のこれらのパラメーターの設定方法を目的別にまとめたものです。

目的[グローバルなデータ同期モード] パラメーターの設定coder.extrinsic を使用する関数呼び出し生成コードの動作

最大の一貫性。

MEX 関数エントリ時、終了時、および外部の呼び出し時不使用

  • MEX 関数の実行の開始時と終了時に MEX 関数と MATLAB の間で一貫性が確保される。

  • 外部関数呼び出しの後に一貫性が確保される。

この動作は既定です。

ほとんどの外部関数呼び出しがグローバル データを変更し、一部の外部関数が変更しないときの同期の動作を最適化する。MEX 関数エントリ時、終了時、および外部の呼び出し時特定の外部関数について、引数 "-sync:off" を使用して同期と定数値のチェックを無効にする

  • MEX 関数の実行の開始時と終了時に MEX 関数と MATLAB の間で一貫性が確保される。

  • 外部呼び出しに "-sync:off" 引数が含まれている場合を除き、外部関数呼び出しの後に一貫性が確保される。

少数の外部関数呼び出しのみがグローバル データを変更するときの同期の動作を最適化する。MEX 関数エントリ時と終了時特定の外部関数について、引数 "-sync:on" を使用して同期と定数値のチェックを有効にする

  • MEX 関数の実行の開始時と終了時に MEX 関数と MATLAB の間で一貫性が確保される。

  • 外部呼び出しに "-sync:on" 引数が含まれている場合にのみ、外部関数呼び出しの後に一貫性が確保される。

外部呼び出しがグローバル データを変更しないときの同期の動作を最適化する。MEX 関数エントリ時と終了時不使用

  • MEX 関数の実行の開始時と終了時に MEX 関数と MATLAB の間で一貫性が確保される。

  • 外部関数呼び出しの後に一貫性が確保されない。

同期を無効にすることで潜在的にパフォーマンスを最適化する。コードがグローバル データを変更しない場合を除き、このモードは使用しない。無効使用不可

  • MEX 関数と MATLAB の間で一貫性が確保されない。

  • 外部関数呼び出しの後に一貫性が確保されない。グローバル データの同期が無効になっているときは、"-sync:on" 引数を使用して外部関数の同期を有効にすることはできない。

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

MEX 関数と MATLAB にはグローバル データの独自のコピーがそれぞれ存在するため、MEX の連続実行で必ず同じ結果が得られるように、どちらのコピーもクリアしなければなりません。

MATLAB ワークスペース内のグローバル データのコピーを消去するには、次のコマンドを使用します。

clear global

MEX ワークスペース内のグローバル データのコピーを消去するには、次のコマンドを使用します。

clear MEX

あるいは、次のコマンドを使用して両方のグローバル データのコピーを削除します。

clear all

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

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

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

  • SIL または PIL の実行中にランタイム エラーが発生すると、グローバル変数は同期されません。グローバル変数 g をインクリメントし、ランタイム エラーを生成する関数 SILtest について考えます。

    function SILtest
    global g;
    g = g + 1;
    error('MyError');
    end
    MATLAB および MEX の実行では、SILtest はワークスペース内のグローバル変数 g をインクリメントして同期します。しかし、SIL の実行では、ランタイム エラーのため、ワークスペース内でグローバル変数 g がインクリメントされません。グローバル変数を用いた SIL および PIL の実行に関する詳細については、Speed Up SIL/PIL Execution by Disabling Constant Input Checking and Global Data Synchronization (Embedded Coder)を参照してください。

参考

| |

トピック