2

我见过这样的解决方案:

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< count 是否重要,如果内核工作项尝试处理不可用的项会发生什么?在第一个示例中它不存在的原因是否是程序员只是确保全局大小等于要处理的元素数量(这是否正常)?

4

1 回答 1

4

这样做通常有两个原因——

  1. 确保开发人员错误不会杀死代码或读取坏内存

  2. 因为有时运行比数据点更多的工作项是最佳的。例如,如果我的设备的最佳工作组大小是 32(并不少见),并且我有一个包含 61 条数据的数组,我将运行 64 个工作项,最后三个将简单地“装死。 "

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

于 2012-06-21T14:29:20.280 回答