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

标签 c opencl local gpgpu nvidia

我正在使用 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));
}

运行此函数时,就好像 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
);

其中 numSpheres 是设置为 2 的常量。

感谢任何/所有反馈。

最佳答案

我在上面的代码中犯了一个菜鸟错误,如果有人遇到过这个问题,请确保您没有将 get_local_id() 的结果分配给 __local 访问限定变量就像我在这里所做的那样:

localID = get_local_id(2);

当然,局部变量会被工作组中的每个线程覆盖,因为局部地址空间是跨工作组共享的。

因此,不要将 localID 声明为:

__local size_t localID;

它应该声明为:

size_t localID;

希望这对某人有帮助。

关于c - OpenCL get_local_id() 永远不会返回 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35975176/

相关文章:

c - 整数值和负值的 getopt 错误处理

c - realloc 无法从其他函数访问新大小

c++ - 未找到 OpenCL 平台

java - 具有本地文件依赖的Maven项目构建错误501

web - 将远程 'client uploaded assets'拉入本地网站开发环境

c - 使用 strcat() 连接从 void 函数收集的两个值

c - 尝试用 C 语言运行程序

python - 通过从旧列表复制来创建新列表

c++ - clEnqueueCopyBufferRect 是如何工作的?

assembly - 在设备上实现 OpenCL 需要采取哪些步骤?