VSC は、アプリケーション コードの開発とアクセラレータ ハードウェアへのソフトウェア呼び出しを管理するためのシンプルなテンプレートを提供しています。このテンプレートを使用すると、ハードウェア構成に関係なく、C++ ソフトウェア API を統一された形式で作成できます。
auto arg1BP = myACC::create_bufpool( .... ); (1)
....
myACC::send_while([= .... ]() // (2)
{
int* arg1 = myAcc::alloc_buf<int>(arg1BP, .... ); // (4)
....
myACC::compute( arg1, .... ); // (5)
....
return ( while_cond ); // (3)
}
myACC::receive_all_in_order([= .... ]() // (6)
{
....
}
myACC::join(); // (7)
上記の擬似コードに示されるように、このテンプレートの構造は、次の部分で構成されています。これらの詳細は、VPP_ACC クラスの API を参照してください。
-
create_bufpool()
: アクセラレータに渡されたポインター引数ごとにバッファー プールを作成し、引数データ (入力、出力、リモートなど) の仕様を提供します。 -
send_while()
: アクセラレータ上のジョブの全体的なスケジューリングを制御するスレッドで、ラムダ関数を使用して各ジョブにデータを提供します。 -
return ( while_cond );
: ラムダ関数の本体をループで実行して、必ずブール値を返します。send_while
本体内のreturn
文を使用すると、返される値が true である限りループの実行を継続し、false の場合にループを停止してsend_while
スレッドを終了できます。return
文は、ラムダ関数を宣言して使用する前にsent_value
が 0 に設定されている場合は、++sent_value<MAX_SEND
にできます。 -
alloc_buf()
: 現在のループ イテレーションのバッファー プールからのメモリ バッファー オブジェクトを割り当てます。 -
compute()
: アクセラレータ ハードウェアでcompute()
関数の 1 つのジョブ実行をスケジュールするソフトウェア呼び出しです。 -
receive_all_in_order()
: スケジュールされたジョブの結果を待つスレッドです。これはユーザー定義のもう 1 つのラムダ関数であり、send_while()
スレッドが実行されている間はループで実行されます。 -
join()
: 送信および受信スレッドの完了を待ちます。
次のセクションでは、アプリケーション コードを作成するその他の詳細を示します。