OpenCLでasync_work_group_copy()を正しく使用する方法を理解したいと思います。のは、簡単な例で見てみましょう:。OpenCLでasync_work_group_copyを使用するには?
__kernel void test(__global float *x) {
__local xcopy[GROUP_SIZE];
int globalid = get_global_id(0);
int localid = get_local_id(0);
event_t e = async_work_group_copy(xcopy, x+globalid-localid, GROUP_SIZE, 0);
wait_group_events(1, &e);
}
参照がhttp://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/async_work_group_copy.html srcからdstへNUM_ELEMENTS gentype要素の非同期コピーを実行します」と言うの非同期コピーがワークグループ内のすべての作業項目によって実行され、したがって、この組み込み関数は、同じ引数値でカーネルを実行しているワークグループ内のすべての作業項目によって検出されなければなりません。そうでなければ、結果は未定義です。
しかし、それは私の質問を明確にしない...
次の仮定が正しければ、私は、知っているしたいと思います:
- (async_work_group_copyの呼び出し)は、すべての作業によって実行されなければなりませんグループ内の項目。
- 呼び出しは、送信元アドレスがすべての作業項目で同一であり、コピーするメモリ領域の最初の要素を指している必要があります。
- ソースアドレスは、ワークグループ内の最初の作業項目のグローバル作業項目IDに基づいているため、だから私はすべての作業項目のアドレスを同一にするためにローカルIDを引く必要があります...
- 3番目のパラメータは本当に要素の数です(バイト単位ではありません)?
ボーナス質問:
。 wait_group_events()の代わりにバリア(CLK_LOCAL_MEM_FENCE)を使用して戻り値を無視することはできますか?もしそうなら、それはおそらくもっと速いでしょうか?
b。ローカルコピーはCPU上での処理にも意味がありますか、それともキャッシュを共有しているのでオーバーヘッドですか?
よろしく、 ステファン
ありがとうございました! 3に関してget_group_id() - いいヒントですが、このスペシャルでは、サイズ2^nの既知のワークグループサイズであっても、作業グループのサイズによって乗算が必要になります。これは、shift-leftによって高速化できます。しかし、他の場合には、これも存在することを知るためには非常に便利です!あなたの経験を共有してくれてありがとう! --- Stefan – SDwarfs
"a"に対するあなたの答えに関する質問があります:私が理解する限り、コピーは少なくとも1つの作業項目によって処理されるべきです。ワークグループ内の他のすべてのノードは、ローカルデータを準備する必要があるため、データが利用可能になるのを待っています。イベントを待つことはまさにそれを行うべきです。しかし、障壁は、グループの他のすべての作業項目がコピー処理に従事する作業項目を待つので、同じことを保証する必要があります。障壁はもっと簡単です(作業グループごとに最大で1つの障壁に対して、1つの作業アイテムにつき最大で1つのイベント待ち)ので、より速くなります。 – SDwarfs
re: 'a' ...将来、作業項目を使用せずに非同期コピーを処理するデバイスが存在する可能性があります。少なくとも1つの作業項目がコピー操作によって保持されていれば、障壁が機能します。 – mfa