VIOSにおいて大域変数とは、すべてのワーキングセット(並列実行単位)からアクセス可能な
変数を指し、プログラム中において、parallel文、局所化された逐次処理部文の外で宣言された
変数、及びモジュール呼び出し時に渡されるパラメータが該当します。
大域変数へのアクセスは、デフォルトでは各ワーキングセットからの同時アクセスに対応するため、
排他制御されます。
並列処理において、ネットワークを介したデータへのアクセスや排他制御により生じる
オーバーヘッドは非常に大きいため、VIOSではプログラマブル大域変数バッファと呼ぶ概念を
導入しています。
プログラマブル大域変数バッファとは、並列処理の際にホストごとに起動されている各IPUが
各ホスト上に大域変数のコピーバッファを持ち、
そのバッファにアクセスをすることによって
ネットワークを介したアクセスや 排他制御を避けます。
そのため、このバッファに書き込みを行う処理の場合、各IPUごとにバッ
ファの内容が異なっ
たものとなります。この大域変数バッファを統合するために、VIOSでは3種類の統合法を持って
います。その内容とプログラム中の記述方を以下に示します。
プログラム中での記述方法
#vios mutex 変数名 排他制御の有無 統合方法
変数名 : 制御を適用する大域変数の名前
排他制御の有無 : 排他制御を行うかどうかの指定
この指定にはon,offの2種類から一方を選択します。onの 場合はネットワークを介した大域変数への排他制御アクセスを行います。 offの場合はプログラマブル大域変数バッファを用います。 offの場合のみ、次の統合方法を指定します。
統合方法 : バッファの統合方法の指定です。次の3つから選びま す。 例えば、整数型大域変数GlobalValueにバッファ使用、加算統合を 適用する場合は以下のように記述します。
- add : バッファを加算統合します。
- max : バッファ中の最大値を使用します。
- min : バッファ中の最小値を使用します。
// 大域変数の宣言 int GlobalValue; // 制御方法の指定 #vios mutex GlobalValue off add※大域変数を利用したプログラム例1: ヒストグラムの作成
通常、配列変数に対し、結合制御を行った場合、配列要素個々に対し制御
が働きます。つまり、
要素0はipu0から、要素1はipu1から... というように独立した変数のように働きます。
しかし、テンプレートマッチングの様にある値が最小、または最大の場合
に、その値に伴う別の値
が必要である、ということが起こります。
そのために、変数が配列変数であり、制御がmin、max
の場合には追加命令が存在します。これは、
#vios mutex 配列変数 off min depend_on_firstという書式で使用します。ここでdepend_on_firstは予約語です。 minの他にmaxでも使用
※大域変数を利用したプログラム例2: テンプレートマッチング