このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
グローバル変数のコード生成
グローバル変数を使用する MATLAB® 関数の C/C++ コードと MEX 関数を生成できます。グローバル変数を使用する MATLAB コードの MEX 関数を実行すると、生成された関数と MATLAB にそれぞれ独自の変数のコピーが保持されます。それらのコピー間でデータを同期する方法を決めなければなりません。また、コード生成用の MATLAB コードでグローバル データを使用している場合、一定の制限が適用されます。
グローバル データを使用する MATLAB 関数のコードの生成
グローバル変数を使用する MATLAB 関数のコードを生成するときは、コード生成前かコード生成時に変数を定義して初期化する必要があります。コード生成時にグローバル変数が定義されていない場合、コード ジェネレーターは MATLAB グローバル ワークスペース内でグローバル変数を探します。グローバル変数が存在しない場合、コード生成は失敗します。
グローバル変数を使用する MATLAB 関数のコードを生成するには、次のいずれかの方法を使用します。
グローバル ワークスペースでのグローバル変数の定義と初期化
コード生成前に 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 関数エントリ時、終了時、および外部の呼び出し時 | 特定の外部関数について、引数 "-sync:off" を使用して同期と定数値のチェックを無効にする |
|
少数の外部関数呼び出しのみがグローバル データを変更するときの同期の動作を最適化する。 | MEX 関数エントリ時と終了時 | 特定の外部関数について、引数 "-sync:on" を使用して同期と定数値のチェックを有効にする |
|
外部呼び出しがグローバル データを変更しないときの同期の動作を最適化する。 | MEX 関数エントリ時と終了時 | 不使用 |
|
同期を無効にすることで潜在的にパフォーマンスを最適化する。コードがグローバル データを変更しない場合を除き、このモードは使用しない。 | 無効 | 使用不可 |
|
グローバル データのクリア
MEX 関数と MATLAB にはグローバル データの独自のコピーがそれぞれ存在するため、MEX の連続実行で必ず同じ結果が得られるように、どちらのコピーもクリアしなければなりません。
MATLAB ワークスペース内のグローバル データのコピーを消去するには、次のコマンドを使用します。
clear global
MEX ワークスペース内のグローバル データのコピーを消去するには、次のコマンドを使用します。
clear MEX
あるいは、次のコマンドを使用して両方のグローバル データのコピーを削除します。
clear all
生成されたコードのグローバル データ制限
グローバル構造体変数には、ハンドル オブジェクトまたはスパース配列を含めることができません。
coder.cstructname
はグローバル変数に直接適用できません。グローバル変数で使用する構造体型に名前を付けるには、coder.cstructname
を使用して、構造体型に名前を付ける型オブジェクトを作成します。次に、codegen
を実行するときに、グローバル変数にその型があることを指定します。グローバル構造体変数と共に使用するための C 構造体型の命名を参照してください。SIL または PIL の実行中にランタイム エラーが発生すると、グローバル変数は同期されません。グローバル変数
g
をインクリメントし、ランタイム エラーを生成する関数SILtest
について考えます。MATLAB および MEX の実行では、function SILtest global g; g = g + 1; error('MyError'); end
SILtest
はワークスペース内のグローバル変数g
をインクリメントして同期します。しかし、SIL の実行では、ランタイム エラーのため、ワークスペース内でグローバル変数g
がインクリメントされません。グローバル変数を用いた SIL および PIL の実行に関する詳細については、Speed Up SIL/PIL Execution by Disabling Constant Input Checking and Global Data Synchronization (Embedded Coder)を参照してください。
参考
MATLAB Coder | global
| codegen