我见过这样的解决方案:
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&lt;重要的是,如果内核工作项尝试处理不可用的项目会发生什么? 在第一个例子中它不存在的原因是程序员只是确保全局大小等于要处理的元素数量(这是正常的)吗?
答案 0 :(得分:4)
这通常有两个原因 -
确保开发人员错误不会终止代码或读取不良内存
因为有时运行更多的工作项比使用数据点更合适。例如,如果我的设备的最佳工作组大小为32(并非罕见),并且我有一个包含61个数据的数组,那么我将运行64个工作项,最后三个将简单地“玩死”。 “
为了不包括此检查,您必须使用工作组大小来划分工作项的总数。在这种情况下,这将使您的工作组大小为1(因为61是素数),这将非常慢!