2012-06-20 14 views
1

我见过的解决方案是这样的:OpenCL的,是出界将检查内核重要

kernel dp_square (const float *a, 
float *result) 
{ 
int id = get_global_id(0); 
result[id] = a[id] * a[id]; 
} 

kernel dp_square (const float *a, 
float *result, const unsigned int count) 
{ 
int id = get_global_id(0); 
if(id < count) 
    result[id] = a[id] * a[id]; 
} 

于ID <计数重要的检查,如果内核的工作会发生什么项目尝试处理一个不可用的项目? 在第一个例子中它可能不存在的原因是程序员只是确保全局大小等于要处理的元素数量(这是正常的)吗?

+0

超出范围的访问是一个错误,需要消除,并且在大多数情况下它会降低执行速度 – ardiyu07

回答

3

这往往是做的原因有两个 -

  1. 为了确保开发人员的错误不杀码或阅读记性不好

  2. 因为有时它是最佳的运行更工作项目比有数据点。例如,如果我的设备的最佳工作组大小为32(并不少见),并且我有61个数据的数组,我将运行64个工作项目,而最后三个项目将简单地“发挥作用。 “

为了不包含此检查,您必须使用工作组大小来划分工作项的总数。在这种情况下,这将使您的工作组大小为1(因为61是总理),这将非常缓慢!

+0

谢谢!这为我澄清了它 –