1

OpenCL には 2 つのワーク グループがあり、それぞれに 100 個のワーク アイテムがあります。だから私はこのようなことをします:

....
clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&hDeviceMemInput);  
clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&hDeviceMemOutput); 
clSetKernelArg(kernel, 2, sizeof(cl_float) * 100, NULL);
clSetKernelArg(kernel, 3, sizeof(cl_int) * 1, &mCount);

clEnqueueNDRangeKernel(CmdQueue, Kernel, 1, 0, 200, 100, 0, 0, 0); 
....

OpenCL コード:

__kernel square(
__global float *input,
__global float *output,
__local float *temp,
const unsigned int count)
{
int gtid = get_global_id(0);
int ltid = get_local_id(0);
if (gtid < count)
{
    temp[ltid] = input[gtid];
    output[gtid] =  temp[ltid] * temp[ltid];
}
}

私が理解しているように、各グループには float[100] ローカル一時変数があります。私の場合、デバイスには float[100] が 2 つあります。n 個のワーク グループがある場合、デバイスには n 個の float[100] があります。そうですか?__local float *temp はデバイスで使用されていますか? 次のようなものを使用して、カーネルからアクセスできますか?

clEnqueueReadBuffer(CmdQueue, ??, CL_TRUE, 0, 100* sizeof(cl_float),  
    host_temp, 0, 0, 0);  

ローカル メモリはグローバル メモリよりもはるかに高速ですか? ローカルメモリを使用するためのヒントはありますか?

4

1 に答える 1

2

ローカル メモリは、非常に高速な一時メモリです。したがって、アクセスしたり、読み返したりすることはできません。連続して上書きされるからです。実際、メモリはデバイスで予約されていないため、2 つのワーク グループが同じローカル メモリを異なる時間に使用する可能性があります (実際にそうなる可能性があります)。100 個のグループと 2 個のコンピューティング ユニットがある場合... 上書きが何回発生するか想像してみてください。

ローカル メモリの結果を読み取りたい場合は、最初にグローバルにコピーしてから、そこから読み取る必要があります。

ローカル メモリの意図は、一時的な中間結果と高速アクセスのためにワークアイテム間で何かを共有することです。その後、それは破壊されます。これは多くのことに役立ちます。簡単な例の 1 つは、画像のフィルタリングです。

編集:

ローカル メモリは、レジスタ、つまり HW リソースと考えることができます。レジスタを RAM として使用することはできません。ローカル メモリをグローバル メモリとして使用できないのと同じです。

于 2013-09-11T15:09:41.357 に答える