OpenCL是否支持数组初始化器,包括使用0进行默认初始化?

4

在我的内核中,我需要一个积累器数组。

__kernel myKernel(...)
{
    float accum[SIZE] = {};

    for(i=0; i<ITER; ++i) {
       accum[...] += ...
    }

    ...
}

在C语言中,= {}会将数组初始化为0,但我不确定在OpenCL中是否也是这样?我需要像下面这样写,还是会造成计算资源浪费?

float accum[SIZE];
for(int i=0; i<SIZE; ++i) accum[i] = 0;

你的示例中没有任何静态分配的变量。它们都是私有的(或自动的)。我建议将其命名为“OpenCL是否支持数组初始化器?”或类似的标题。 - Tim
@Tim 很好的观点,谢谢。 - Nicu Stiurca
另外,FWIW我已经在英特尔GPU OpenCL实现中成功地使用了零初始化器(={0})。我记得遇到过一个随机大小限制(如果太大则编译错误)。 - Tim
1个回答

5
OpenCL C 是 ISO/IEC 9899:1999 C 语言规范(即 C99)的一个衍生版本。在这两个规范中,= { 0 } 均可用于将数组清零(注意 0,空的初始化列表在 C 中不被允许)。
实际上,在启动内核之前,一些实现可能会将设备私有和/或本地内存清零,但这不是可以依赖的行为。

我知道OpenCL是C的衍生物,但你能指出OpenCL规范中明确要求这种初始化的地方吗?我问这个问题是因为我担心这个要求可能已经被取消了,以简化OpenCL规范/驱动程序。 - Nicu Stiurca
OpenCL规范本身并不涉及这个具体的点,只是将您重定向到ISO C99规范(如果我没记错的话,在前几页)。因此,C99规则适用:您不需要初始化变量,但如果不初始化,则内容未定义。 - user703016
1
很抱歉打扰了,但我认为这并不正确: 这个stackoverflow的回答(https://dev59.com/EmMm5IYBdhLWcg3wdu5V#17589839) 表明空初始化程序是不被允许的。虽然规范中没有找到相关内容,但他的论点很有说服力。也许OpenCL C规范对此有不同的说法? - bobismijnnaam
@bobismijnnaam 很好的观点,我已经编辑了我的回答。 我当时在想C ++,它允许空初始化程序。 - user703016

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接