【问题标题】:OpenCL get_local_id() never returns 0?OpenCL get_local_id() 永远不会返回 0?
【发布时间】:2016-03-13 20:07:04
【问题描述】:

我正在使用 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 的常量。

感谢任何/所有反馈。

【问题讨论】:

  • 问题标题很好,答案确实匹配。但是,问题文本没有用,因为它太复杂了。该错误不应与光线跟踪有关。它应该可以通过更短的内核来重现。如果您将其简化为一个产生相同错误的小得多的示例,您的问题将对更多读者更有用。
  • 我同意。我会尽快编辑和修复这个问题。过去几天我真的很忙,但在接下来的 24 小时内,我会继续进行这些更改。感谢您的建设性批评。

标签: c opencl local gpgpu nvidia


【解决方案1】:

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

localID = get_local_id(2);

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

所以不要将localID 声明为:

__local size_t localID;

应该声明为:

size_t localID;

希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2019-11-15
    • 2011-07-25
    • 1970-01-01
    • 2012-10-02
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多