OpenCL get_local_id() 从不 returns 0?
OpenCL get_local_id() never returns 0?
我正在使用 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
的常量。
Any/all 欢迎反馈。
我在上面的代码中犯了一个菜鸟错误,如果有人遇到这个问题,请确保您没有像我在这里那样将 get_local_id()
的结果分配给 __local
访问限定变量:
localID = get_local_id(2);
当然,本地变量会被工作组中的每个线程覆盖,因为本地地址 space 是跨工作组共享的。
所以不要将 localID
声明为:
__local size_t localID;
应声明为:
size_t localID;
希望这对某人有所帮助。
我正在使用 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
的常量。
Any/all 欢迎反馈。
我在上面的代码中犯了一个菜鸟错误,如果有人遇到这个问题,请确保您没有像我在这里那样将 get_local_id()
的结果分配给 __local
访问限定变量:
localID = get_local_id(2);
当然,本地变量会被工作组中的每个线程覆盖,因为本地地址 space 是跨工作组共享的。
所以不要将 localID
声明为:
__local size_t localID;
应声明为:
size_t localID;
希望这对某人有所帮助。