4

我注意到许多看起来像这样的内核源代码(通过谷歌搜索随机找到):

__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 个处理器什么都不做——他们得到虚拟内核吗?)。

我检查了规格。,并且唯一相关提及的“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.

. . . 依据如何

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

谢谢,
伊恩

4

1 回答 1

3

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

通常,只有在您对数据进行分区的情况下才需要这种类型的检查,您知道您可能会执行相对于数组大小的额外工作项。根据我的经验,您几乎总是可以避免这种情况。

于 2012-06-15T20:19:24.907 回答