グラフ API を使用したパラメーターのアップデート/読み出し - 2023.2 日本語

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

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

デフォルトのコンパイル モードでは、main アプリケーションは個別の制御スレッドとしてコンパイルされます。この制御スレッドは、AI エンジン アレイ上で実行されるグラフと並行して PS 上で実行する必要があります。main アプリケーションは、アップデート API および読み出し API を使用して、グラフ内で宣言されたランタイム パラメーターに任意のレベルでアクセスできます。このセクションでは、これらの API を例を使用して説明します。

同期アップデート/読み出し

次のコードは、ランタイム データ パラメーターの指定 に説明されている simple_param グラフの main アプリケーションを示します。

#include "param.h"
parameterGraph mygraph;

int main(void) {
  mygraph.init();
  mygraph.run(2);
  
  mygraph.update(mygraph.select_value, 23);
  mygraph.update(mygraph.select_value, 45);

  mygraph.end();
  return 0;
}

この例では、グラフ mygraph が初期化された後に反復が 2 回実行されます。これにより、受信カーネルの実行ごとに新しい値で更新する必要がある入力パラメーター ポート select_value がトリガーされます。API の最初の引数 update はアップデートするポートを示し、2 番目の引数はその値を示します。ポートの方向、そのデータ型、およびスカラー パラメーターか配列パラメーターかに基づいて、ほかにもいくつかのアップデート API がサポートされています。

プログラムが固定された回数のテスト反復を使用してコンパイルされている場合、トリガーされたパラメーターに対して、main プログラム内のアップデート API 呼び出しの数がテスト反復回数と一致している必要があります。一致していない場合、シミュレーションが追加のアップデートを待機し続けることになる可能性があります。非同期パラメーターの場合、アップデートはグラフの実行とは非同期に実行されれ、アップデートされなかった場合はカーネルは以前の値を使用します。

さらに、前のグラフが同期入出力パラメーターを使用してコンパイルされている場合は、次の例に示すように、アップデート呼び出しと読み出し呼び出しを交互に実行する必要があります。

#include "param.h"
parameterGraph mygraph;

int main(void) {
  int result0, result1;
  mygraph.init();
  mygraph.run(2);

  mygraph.update(mygraph.select_value, 23);
  mygraph.read(mygraph.result_out, result0);
  mygraph.update(mygraph.select_value, 45);
  mygraph.read(mygraph.result_out, result1);

  mygraph.end();
  return 0;
}

この例では、グラフは反復ごとに入出力ポート result_out を介してスカラー結果を生成すると想定されています。read API は、各反復後にこのポートの値を同期的に読み出すために使用されます。read API の最初の引数はリードバックするグラフの入出力ポートを示し、2 番目の引数はその値を保存する場所を示します (参照により渡す)。

同期プロトコルにより、グラフで値が生成されてから読み出し操作用に値がサンプリングされ、グラフの値が読み出されてから次の反復に進むようになります。このため、updateread を交互に実行することが重要です。

非同期アップデート/読み出し

入力パラメーターが非同期プロトコルで指定されている場合、最初のアップデートが実行されてパラメーターが初期化されてからカーネルが実行されます。ただし、次のアップデートの前に、カーネルが任意の回数実行される可能性があります。これは通常、アプリケーション運用時に非同期にアップデートされることを意図しています。デバッグでは、次の例に示すように、次のアップデートの前に、反復を決まった回数実行するために wait API を使用できます。

#include "param.h"
asyncGraph mygraph;

int main(void) {
  int result0, result1;
  mygraph.init();

  mygraph.update(mygraph.select_value, 23);
  mygraph.run(5);
  mygraph.wait();
  mygraph.update(mygraph.select_value, 45);
  mygraph.run(15);
  mygraph.end();
  return 0;
}

上記の例では、最初のアップデート後に反復が 5 回実行され、その後に別のアップデートが実行されてから、反復が 15 回実行されます。グラフに非同期入出力ポートがある場合は、待機 (または終了) の直後にデータをリードバックすることもできます。

非同期アップデートの別のテンプレートでは、次の例に示すように、wait API でタイムアウトを使用します。

#include "param.h"
asyncGraph mygraph;

int main(void) {
  int result0, result1;
  mygraph.init();
  mygraph.run();
  mygraph.update(mygraph.select_value, 23);
  mygraph.wait(10000);
  mygraph.update(mygraph.select_value, 45);
  mygraph.resume();
  mygraph.end(15000);
  return 0;
}

この例では、グラフは無限に実行されるよう設定されています。ただし、run API が呼び出された後、最初のアップデートでパラメーターが初期化されるまで実行がブロックされます。その後約 10,000 サイクル実行されてから、制御スレッドで別のアップデートが実行できるようになります。新しいアップデートは、次のカーネル呼び出し境界で有効になります。その後、グラフがさらに 15,000 サイクル実行されてから終了します。