gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:28:02 27 4
gpt4 key购买 nike

我正在使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com