デバイス側で3つのキューを同時に待つことができる特別な「待機待ち」機能があります。ホスト側?3つのキュー+すべてのキューの終了またはデバイス側のチェックポイント
他のコマンドキューが同じ(垂直)バリア/チェックポイントをヒットして待機してデバイス側から続行するのを待たなければならないようにコマンドキューに送信するチェックポイントコマンドがあるので、ホスト側の往復は必要ありません?
は今のところ、私は2つの異なるバージョンを試みた:秒1は少し速くなる
clWaitForEvents(3, evt_);
と
int evtStatus0 = 0;
clGetEventInfo(evt_[0], CL_EVENT_COMMAND_EXECUTION_STATUS,
sizeof(cl_int), &evtStatus0, NULL);
while (evtStatus0 > 0)
{
clGetEventInfo(evt_[0], CL_EVENT_COMMAND_EXECUTION_STATUS,
sizeof(cl_int), &evtStatus0, NULL);
Sleep(0);
}
int evtStatus1 = 0;
clGetEventInfo(evt_[1], CL_EVENT_COMMAND_EXECUTION_STATUS,
sizeof(cl_int), &evtStatus1, NULL);
while (evtStatus1 > 0)
{
clGetEventInfo(evt_[1], CL_EVENT_COMMAND_EXECUTION_STATUS,
sizeof(cl_int), &evtStatus1, NULL);
Sleep(0);
}
int evtStatus2 = 0;
clGetEventInfo(evt_[2], CL_EVENT_COMMAND_EXECUTION_STATUS,
sizeof(cl_int), &evtStatus2, NULL);
while (evtStatus2 > 0)
{
clGetEventInfo(evt_[2], CL_EVENT_COMMAND_EXECUTION_STATUS,
sizeof(cl_int), &evtStatus2, NULL);
Sleep(0);
}
を(私は他の誰かからそれを見て)との両方が3つのフラッシュコマンドの後に実行されています。
CodeXLプロファイラの結果を見ると、最初は終了点の間隔が長くなり、一部の操作は重複していないように見えます。 2つ目は3つのフィニッシュポイントがすべて3ミリ秒以内であることを示しているため、より速くて長い部分が重複しています(同時に読み込み+書き込み+計算)。
これを達成する方法がある場合は、ホスト側からの待機コマンドが1つだけであれば、その「フラッシュ」バージョンも必要ですが、見つけられませんでした。
各パイプラインステップ間にフラッシュを追加するのではなく、下の画像を得る方法はありますか?
queue1 write checkpoint write checkpoint write
queue2 - compute checkpoint compute checkpoint compute
queue3 - checkpoint read checkpoint read
すべてのチェックポイントを垂直に同期させる必要があり、これらのアクションはすべて信号が与えられるまで開始してはなりません。以下のような:
queue1.ndwrite(...);
queue1.ndcheckpoint(...);
queue1.ndwrite(...);
queue1.ndcheckpoint(...);
queue1.ndwrite(...);
queue2.ndrangekernel(...);
queue2.ndcheckpoint(...);
queue2.ndrangekernel(...);
queue2.ndcheckpoint(...);
queue2.ndrangekernel(...);
queue3.ndread(...);
queue3.ndcheckpoint(...);
queue3.ndread(...);
queue3.ndcheckpoint(...);
queue3.ndread(...);
queue1.flush()
queue2.flush()
queue3.flush()
queue1.finish()
queue2.finish()
queue3.finish()
チェックポイントは、すべてのデバイス側で処理され、わずか3フィニッシュコマンドがホスト側から必要とされている
私は3から3キューをバインドする方法(すべてのキューのためのより良い、唯一の1つの仕上げ?)イベントは "clWaitForEvents(3、evt_);"今のところ:
hCommandQueue->commandQueue.enqueueBarrierWithWaitList(NULL, &evt[0]);
hCommandQueue2->commandQueue.enqueueBarrierWithWaitList(NULL, &evt[1]);
hCommandQueue3->commandQueue.enqueueBarrierWithWaitList(NULL, &evt[2]);
この「エンキューバリア」が他のキューと話すことができれば、どうすれば実現できますか?すべてのキューが終了するか、キューを削除したり後で再利用できるようになるまで、ホスト側のイベントを有効に保つ必要がありますか?
hCommandQueue->commandQueue.enqueueBarrierWithWaitList(NULL, &evt[0]);
hCommandQueue2->commandQueue.enqueueBarrierWithWaitList(evt_0, &evt[1]);
hCommandQueue3->commandQueue.enqueueBarrierWithWaitList(evt_0_and_1, &evt[2]);
in the end wait for only evt[2] maybe or using only 1 same event for all:
hCommandQueue->commandQueue.enqueueBarrierWithWaitList(sameEvt, &evt[0]);
hCommandQueue2->commandQueue.enqueueBarrierWithWaitList(sameEvt, &evt[1]);
hCommandQueue3->commandQueue.enqueueBarrierWithWaitList(sameEvt, &evt[2]);
where to get sameEvt object?
誰もこれを試してみました:ドキュメントから、それはので、多分それは同様である第一1のイベントと一緒に三番目に置くことが可能な第2キュー2つ目の障壁イベントに置くことができる最初の障壁のイベントのように思えますか?ホスト側から何らかのイベントを発生させるか、または "enqueue"の実行が%100を信頼できる "私がフラッシュ/終了するまで開始しない"にするまで、バリアを持つすべてのキューを開始する必要がありますか?ホストからデバイスへイベントを発生させるには(sameEvtには "raise"機能はありませんが、clCreateUserEventですか?)
すべての3つのキューは、順序どおりのタイプであり、同じコンテキストにあります。アウトオブオーダータイプは、すべてのグラフィックスカードでサポートされていません。 C++バインディングが使用されています。
また、enqueueWaitList(これは廃止予定ですか?)とclEnqueueMarkerがありますが、それらを使用する方法はわかりませんし、KhronosのWebサイトには例がありません。
ありがとうございました。私は最初のエンキューとしてマーカーを使用し、その後flush + finishの1秒後にclsetusereventstatusで設定しました。すべてのキューを正確に1秒間開始しました。私はエンドポイントと同じイベントを待ちます(マーカーを使用してデバイス側のイベントを使用)。 –