デフォルトのコンパイル モードでは、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 番目の引数はその値を保存する場所を示します (参照により渡す)。
同期プロトコルにより、グラフで値が生成されてから読み出し操作用に値がサンプリングされ、グラフの値が読み出されてから次の反復に進むようになります。このため、update
と read
を交互に実行することが重要です。
非同期アップデート/読み出し
入力パラメーターが非同期プロトコルで指定されている場合、最初のアップデートが実行されてパラメーターが初期化されてからカーネルが実行されます。ただし、次のアップデートの前に、カーネルが任意の回数実行される可能性があります。これは通常、アプリケーション運用時に非同期にアップデートされることを意図しています。デバッグでは、次の例に示すように、次のアップデートの前に、反復を決まった回数実行するために 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 サイクル実行されてから終了します。