为什么在这个openCL内核代码中'localSum'是本地的?
不幸的是,我使用的页面是法语 有一个内核:为什么在这个openCL内核代码中'localSum'是本地的?,opencl,Opencl,不幸的是,我使用的页面是法语 有一个内核: __kernel void sumGPU ( __global const double *input, __global double *partialSums, __local double *localSums) { uint local_id = get_local_id(0); uint group_size = get_loc
__kernel void sumGPU ( __global const double *input,
__global double *partialSums,
__local double *localSums)
{
uint local_id = get_local_id(0);
uint group_size = get_local_size(0);
// Copy from global to local memory
localSums[local_id] = input[get_global_id(0)];
// Loop for computing localSums : divide WorkGroup into 2 parts
for (uint stride = group_size/2; stride>0; stride /=2)
{
// Waiting for each 2x2 addition into given workgroup
barrier(CLK_LOCAL_MEM_FENCE);
// Add elements 2 by 2 between local_id and local_id + stride
if (local_id < stride)
localSums[local_id] += localSums[local_id + stride];
}
// Write result into partialSums[nWorkGroups]
if (local_id == 0)
partialSums[get_group_id(0)] = localSums[0];
}
我唯一的问题是为什么localSums被声明为local?这个代码可以进一步优化吗
请注意以下行如何访问数组中另一个工作项的“插槽”
localSums[local_id] += localSums[local_id + stride];
实现这一点的唯一方法是使用本地或全局内存,而本地内存无疑比全局内存更高效
我只是感到困惑,因为通常我会在内核中声明局部变量,而在这个特定的示例中,主机指定大小并将NULL作为clSetKernelArg的参数传递
如果在内核中声明一个local
缓冲区,则其大小必须在编译时固定。通过内核参数动态设置本地缓冲区的大小意味着您可以使用具有不同组大小的相同内核代码
必须始终从内核内部初始化本地缓冲区,因此在主机端传递NULL
作为参数指针是正确的
localSums[local_id] += localSums[local_id + stride];