OpenCL get_local_id()永远不会返回0?

Mr.*_*Nex 2 c gpgpu nvidia local opencl

我正在使用OpenCL/OpenGL Interop开发一个基本的光线跟踪器.我在内核中存在一些问题,这些内核共享工作组内共享的本地内存.

这是内核:

__kernel void ComputeDirectionalShadowTexture(
    write_only image2d_t shadowTexture,
    read_only image2d_t positionTexture,
    __constant float3* lightDirection, __constant float4* spheres,
    )
{
    __local bool* shadowReduce[2];
    __local size_t idX, idY, idZ, localID;
    idX = get_global_id(0);
    idY = get_global_id(1);
    idZ = get_global_id(2);

    localID = get_local_id(2);

    //...Read Textures
    //...Perform Computation

    //...Write results
    if(shadowReduce[localID])
        write_imagef(shadowTexture, threadCoord.xy, (float4)(1.0f, 0.0f, 0.0f, 1.0f));
}
Run Code Online (Sandbox Code Playgroud)

运行此时,就好像get_local_id()函数永远不会返回0(或只返回1).

我希望问题与我调用内核的方式有关:

size_t numGlobal[3] =
{
    rBuffer->textureWidth,
    rBuffer->textureHeight,
    numSpheres
};
size_t numLocal[3] = { 1, 1, numSpheres};

cl_event execution;

//Execute kernel
clError = clEnqueueNDRangeKernel
(
    buffer->clQueue,
    members->directionalShadowKernel,
    3,
    NULL,
    &numGlobal,
    &numLocal,
    numBeforeExecution,
    completeBeforeExecution,
    &execution
);
Run Code Online (Sandbox Code Playgroud)

numSpheres常数设置为何处2.

任何/所有反馈表示赞赏.

Mr.*_*Nex 5

我做在上面的代码一个新手的错误,如果任何人有过这个问题,请确保您不分配的结果get_local_id()__local,因为我在这里做访问限定的变量:

localID = get_local_id(2);
Run Code Online (Sandbox Code Playgroud)

当然,本地变量会被工作组中的每个线程覆盖,因为本地地址空间在工作组中共享.

因此,而不是声明localID为:

__local size_t localID;
Run Code Online (Sandbox Code Playgroud)

它应该声明为:

size_t localID;
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人.