2012-06-13 56 views
4

我注意到一个数字,像这样的内核源(通过谷歌搜索随机找到):在OpenCL内核中检查get_global_id是否必需?

__kernel void fill(__global float* array, unsigned int arrayLength, float val) 
{ 
    if(get_global_id(0) < arrayLength) 
    { 
     array[get_global_id(0)] = val; 
    } 
} 

我的问题是如果if语句实际上是必要的(假设“arrayLength”在这个例子中是与全球工作规模相同)。

在我看到的一些更“专业”的内核中,它是而不是目前。在我看来,硬件不会将内核分配给无意义的坐标。

但是,我也知道处理器可以分组工作。因此,我可以想象,组中的某些处理器必须不做任何事情(例如,如果您有1个大小为16的组,并且工作大小为41,那么该组将处理前16个工作项,然后接下来的16个工作项,然后接下来的9个,7个处理器没有做任何事情 - 他们是否得到虚拟内核?)。

我检查了spec.和“get_global_id”的唯一相关的一提的是一样的在线文档,其内容为:

The global work-item ID specifies the work-item ID based on the number of global work-items specified to execute the kernel. 

。 。 。基于如何

那是什么?如果数组的大小是工作组大小的倍数,忽略它是否安全?什么?

谢谢
伊恩

回答

3

你有正确的答案了,我想。如果内核执行的全局大小与数组长度相同,那么这个if语句就没用了。

一般来说,只有在您以某种方式对数据进行分区的情况下才需要这种类型的检查,以便您知道可以执行与数组大小相关的额外工作项。根据我的经验,你几乎总能避免这种情况。