パラメーターの推論
カーネル関数の仮引数に整数スカラー値が表示される場合、パラメーターはランタイム パラメーターになります。次の例では、引数 select
および result_out
はランタイム パラメーターです。
#ifndef FUNCTION_KERNELS_H
#define FUNCTION_KERNELS_H
void simple_param(input_buffer<int32> &in, output_buffer<int32> &out, int32 select, int32 &result_out);
#endif
int8
、int16
、int32
、int64
、uint8
、uint16
、uint32
、uint64
、cint16
、cint32
、float
です。filter_with_array_param
関数に渡されます。#ifndef FUNCTION_KERNELS_H
#define FUNCTION_KERNELS_H
void filter_with_array_param(input_buffer<cint16> & in, output_buffer<cint16> * out, const int32 (&coefficients)[32]);
#endif
関数引数 (配列パラメーターを含む) の各パラメーターには、暗黙ポートが推論されます。次の表に、各関数引数に推論されるポートのタイプを示します。
仮引数 | ポート クラス |
---|---|
T | 入力 |
const T | 入力 |
T & | 入出力 |
const T & | 入力 |
const T (&)[ …] | 入力 |
T(&)[…] | 入出力 |
この表から、AI エンジンで関数パラメーターに対して外部から見える変更を加えられない場合、入力ポートが推論されることがわかります。仮引数が値渡しの場合、コピーが作成されるため、そのコピーに対する変更は外部から見えません。パラメーターが const
修飾子付きで渡される場合、パラメーターに書き込めないため、これらも入力ポートとして扱われます。
AI エンジン カーネルにパラメーター参照が渡され、カーネルがそれを変更できる場合、入出力ポートが推論されるので、制御プロセッサからの結果の読み出しに使用できます。
graph::read()
で読み出すことのみが可能です。入出力ポートは、graph::update()
でアップデートすることはできません。arg
リストに 2 回 (1 回は入力として、もう 1 回は入出力として) 現れる必要があります (例: kernel_function(int32 foo_in, int32
&foo_out)
)。パラメーターの接続
入力および入出力ランタイム パラメーター ポートは、それらを含むグラフ内の対応する階層的ポートに接続できます。このメカニズムにより、パラメーターはランタイムに変更するためアクセスできるようになります。次のグラフでは、事前に定義された simple_param
カーネルのインスタンスが作成されます。このカーネルには、2 つの入力ポート、1 つの output
ポート、1 つの inout
ポートがあります。引数リストに現れる最初の引数 in[0]
は入力バッファーです。2 番目の引数は出力バッファーです。3 番目の引数はランタイム パラメーター (バッファー型でもストリーム型でもない) であり、値渡しであるため、入力パラメーター in[1]
として推論されます。4 番目の引数はランタイム パラメーターで、値渡しであるため、inout
パラメーター、inout[0]
として推論されます。
in
、out
、および inout
はそれぞれ独自のカテゴリに属しており、すべてグラフのインデックス 0 から開始します。次のグラフ定義では、simple_param
カーネルがインスタンシエートされ、バッファーは in[0]
および out[0]
(カーネルの入力バッファーと出力バッファー) に接続されます。入力ランタイム パラメーターはグラフの input
ポート、select_value
に接続され、inout
ランタイム パラメーターはグラフの inout
ポート、result_out
に接続されます。
class parameterGraph : public graph {
private:
kernel first;
public:
input_port select_value;
input_plio in;
output_plio out;
inout_port result_out;
parameterGraph() {
first = kernel::create(simple_param);
......
connect(in.out[0], first.in[0]);
connect(first.out[0], out.in[0]);
connect<parameter>(select_value, first.in[1]);//default sync rtp input
connect<parameter>(first.inout[0], result_out);//default async rtp output
}
};
配列パラメーターも同じ方法で接続できます。配列データには、このカーネルがマップされるプロセッサからアクセスできるように、空間が自動的に割り当てられます。
class arrayParameterGraph : public graph {
private:
kernel first;
public:
input_port coeffs;
input_plio in;
output_plio out;
arrayParameterGraph() {
first = kernel::create(filter_with_array_param);
......
connect(in.out[0], first.in[0]);
connect(first.out[0], out.in[0]);
connect<parameter>(coeffs, first.in[1]);
}
};
入力パラメーターの同期
入力ランタイム パラメーター ポートのデフォルト動作は、動作をトリガーすることです。つまり、このパラメーターは、カーネルをいつ実行できるかを決定する規則の一部として使用されます。このグラフの例では、カーネルは次の 3 つの条件が満たされたときにのみ実行されます。
- 32 バイトの入力データの有効なバッファーが使用可能
- 出力データ用に 32 バイトの空のバッファーが使用可能
- 入力パラメーターへの書き込みが発生
トリガー モードでは、入力パラメーターへの 1 回の書き込みでカーネルを 1 回実行でき、カーネルが呼び出されるたびに入力パラメーターの値が設定されます。
入力カーネル パラメーターを非同期で設定できるモードもあります。パラメーターを非同期でアップデートするよう指定するには、ポートの接続時に async 修飾子を使用します。
connect<parameter>(param_port, async(first.in[1]));
カーネル ポートが非同期と指定されている場合、カーネルの起動規則の一部としては使用されません。パラメーターに一度値が書き込まれると、それ以降のカーネル起動にその値が使用されます。PS は、いつでもランタイム パラメーターに新しい値を書き込むことができます。その値は、それ以降のカーネル起動に使用されます。
入出力パラメーターの同期
入出力ランタイム パラメーター ポートのデフォルト動作は、非同期動作です。つまり、パラメーターは制御プロセッサまたはほかのカーネルで読み出すことができますが、プロデューサー カーネルの実行には影響しません。inout
パラメーターからの同期動作で、カーネルの各呼び出しでパラメーター値が読み出されるまでカーネルがブロックされる場合は、次のように、それらを含むグラフで inout
ポートを接続する際に sync 修飾子を使用できます。
connect<parameter>(sync(first.inout[1]), param_port);