Main Content

グローバル データを含むコードからの C コードの生成

ワークフローの概要

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

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

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

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

  3. fiaccel を使用してコードをコンパイルします。

グローバル データを使用する場合は、MATLAB と生成されるコードの間でこのデータを同期するかどうかも指定しなければなりません。MATLAB と生成されるコードの間で相互作用がない場合は、同期を無効にするほうが安全です。相互作用がある場合は、同期を有効にします。詳細は、グローバル データと MATLAB の同期を参照してください。

グローバル変数の宣言

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

function y = use_globals()
%#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) = B(1);
y = AR * 2;

グローバル データの定義

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

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

fiaccel を使用して、グローバル変数の宣言で説明されているように関数 use_globals をコンパイルするには、次の手順に従います。

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

    global AR B;
    AR = fi(ones(4),1,16,14);
    B = fi([1 2 3],1,16,13);
    

  2. 関数をコンパイルして、use_globalsx という名前の MEX ファイルを生成します。

    fiaccel -o use_globalsx use_globals

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

コマンド ラインでグローバル データを定義するには、fiaccel -global オプションを使用します。たとえば、グローバル変数の宣言で説明されているように関数 use_globals をコンパイルするには、コマンド ラインで 2 つのグローバル入力 ARB を指定します。

fiaccel -o use_globalsx ...
   -global {'AR',fi(ones(4)),'B',fi([1 2 3])} use_globals

または、-globals フラグを使用し、-globals {'g', {type, initial_value}} の形式でデータ型と初期値を指定します。

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

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

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

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

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

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

既定では、MATLAB と生成されたコードの間でのグローバル データの同期は、すべての "外部" 呼び出しで MEX 関数のエントリ時と終了時に行われます。外部呼び出しとは、fiaccel によって MATLAB にディスパッチされて実行される、MATLAB パス上にある MATLAB 関数の呼び出しです。これによって、生成されたコードと MATLAB の間で最大の一貫性を確保できます。

パフォーマンスを向上させるには、次のことを行うことができます。

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

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

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

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

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

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

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

ほとんどの外部呼び出しがグローバル データを変更することはなく、一部が変更するときに最大の一貫性を確保します。[MEX 関数の入口と出口で]

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

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

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

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

外部関数でグローバル データの同期を制御するには、-sync:on coder.extrinsic および -sync:off オプションを使用します。

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

  1. コンストラクター コマンドを発行して、MATLAB ワークスペースでコンパイラ オプション オブジェクトを定義します。

    comp_cfg = coder.mexconfig

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

    comp_cfg.GlobalDataSyncMethod = 'SyncAtEntryAndExits';
    

  3. コードをコンパイルするときに、-config コンパイル オプションを使用して指定することで、comp_cfg 構成オブジェクトを使用します。以下に例を示します。

    fiaccel -config comp_cfg myFile

外部関数呼び出しのための同期のコントロール-  外部関数を呼び出す前後に MATLAB と生成されたコードのグローバル データ間で同期を行うかどうかを制御できます。これを行うには、coder.extrinsic -sync:on-sync:off のオプションを使用します。

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

  • グローバル データ同期モードが At MEX-function entry, exit and extrinsic calls である場合は、各外部呼び出しの前後で同期されます。ある特定の外部呼び出しがグローバル データに影響を及ぼさないことが分かっている場合は、-sync:off オプションを使用してこれらの呼び出しに対して同期を無効にしてください。同期をオフにすると、パフォーマンスが向上します。たとえば、関数 foo1 と関数 foo2 がグローバル データに影響を "与えない" 場合は、これらの関数に対して同期を無効にします。

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

  • グローバル データ同期モードが At MEX-function entry and exit の場合は同期されません。グローバル データに影響を及ぼす外部呼び出しがいくつかコードにある場合は、-sync:on オプションを使用してこれらの呼び出しに対して同期を有効にしてください。たとえば、関数 foo1foo2 がグローバル データに影響を "与える" 場合は、これらの関数に対して同期を有効にします。

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

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

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

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

グローバル データ使用の制限

関数 coder.varsize ではグローバル データは使用できません。代わりに、可変サイズのグローバル データの定義に説明されているように coder.typeof オブジェクトを使用して可変サイズのグローバル データを定義します。

関連するトピック