检查OpenCL内核中的get_global_id是否必要?

时间:2012-06-13 04:42:27

标签: opencl

我注意到一些内核源代码看起来像这样(由Googling随机找到):

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

我的问题是if if语句是否真的有必要(假设此示例中的“arrayLength”与全局工作大小相同)。

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

但是,我也知道处理器是成组工作的。因此,我可以想象一个组中的某些处理器必须什么也不做(例如,如果你有一组大小为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.

。 。 。基于如何

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

谢谢,
伊恩

1 个答案:

答案 0 :(得分:3)

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

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