while ( size!=0)
{
if(local_id<size)
local_sums[local_id] += local_sums[local_id+size];
work_group_barrier(clk_local_mem_fence)
size = size/2;
}
在while循环中,CL_LOCAL_MeM_FENCE包含在IF循环中。任务是识别错误并注释当IF_L循环中包含CL_LOCAL_MeM_FENCE时程序无效的原因
我正在学习与我的课程相关的GPU编程。以上我提供了有关我的查询的所有详细信息。我不明白为什么当IF_L循环中包含CL_LOCAL_MeM_FENCE时程序不起作用。拜托,有人帮帮我。谢谢你。
答案 0 :(得分:2)
在OpenCL中,工作组中的所有工作项必须对每种类型执行相同数量的障碍。当一个工作项遇到它的第一个围栏时,它等待所有其他人到达它们的第一个围栏;当它到达第二个时,它等待所有其他人到达围栏2,依此类推。
如果在条件(if,switch,...)块中有栅栏,这通常意味着所有工作项上的条件必须相同,并且如果在循环内有栅栏(for,while,do等等),所有工作项必须运行相同数量的迭代。
从技术上讲,特定围栏在代码中的位置并不重要(即,您可以在条件的if和else部分都有障碍),但它有助于遵循这些规则以便于阅读。