ランタイム データ パラメーターの指定 - 2023.2 日本語

AI エンジン カーネルおよびグラフ プログラミング ガイド (UG1079)

Document ID
UG1079
Release Date
2023-12-04
Version
2023.2 日本語

パラメーターの推論

カーネル関数の仮引数に整数スカラー値が表示される場合、パラメーターはランタイム パラメーターになります。次の例では、引数 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
ランタイム パラメーターは、ストリームおよびバッファーで生成されたパラメーターと共にポートとして処理されます。スカラーおよびスカラー配列のデータ型は、いずれもランタイム パラメーターとして渡すことができます。サポートされるスカラー データ型は、int8int16int32int64uint8uint16uint32uint64cint16cint32float です。
注記: 構造体とポインターは、ランタイム パラメーターとして渡すことはできません。各 AI エンジンにはそれぞれメモリ空間があるので、ポインターが AI エンジン間で渡されると、一貫性が失われます。また、PS と AI エンジンではポインターの表現が異なります。構造体にはメンバーとしてポインターが含まれることがあるため、構造体をランタイム パラメーターとして渡すことはできません。
次の例では、32 個の整数の配列がパラメーターとして 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

関数引数 (配列パラメーターを含む) の各パラメーターには、暗黙ポートが推論されます。次の表に、各関数引数に推論されるポートのタイプを示します。

表 1. パラメーター別のポートのタイプ
仮引数 ポート クラス
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] として推論されます。

注記: カーネルのポートタイプ inout、および 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);