OpenCL是否支持数组初始值设定项,包括0的默认初始化?

OpenCL是否支持数组初始值设定项,包括0的默认初始化?,opencl,Opencl,在我的内核中,我需要一个累加器数组 __kernel myKernel(...) { float accum[SIZE] = {}; for(i=0; i<ITER; ++i) { accum[...] += ... } ... } OpenCLC是ISO/IEC 9899:1999 C语言规范(又名C99)的派生版本。在这两种规范中,是的,={0}将零初始化数组(注意0,空初始值设定项列表是空的) 实际上,在启动内核之前,某些实现可能会

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

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

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

    ...
}

OpenCLC是ISO/IEC 9899:1999 C语言规范(又名C99)的派生版本。在这两种规范中,是的,
={0}
将零初始化数组(注意
0
,空初始值设定项列表是空的)


实际上,在启动内核之前,某些实现可能会用零清除设备私有内存和/或本地内存,但这不是您可以依赖的行为。

示例中的变量都不是静态分配的。它们都是私有的(或自动的)。我建议将此标题改为“OpenCL是否支持数组初始值设定项?”或类似的内容。@Tim说得好,谢谢。另外,我在英特尔GPU OpenCL实现({0})中成功地使用了零初始值设定项。我记得我遇到了一个随机的大小限制(如果太大,则编译错误)。我知道OpenCL是C派生的,但是你能指出OpenCL规范中明确要求这种初始化的地方吗?我这样问是因为我担心为了简化OpenCL规范/驱动程序,这一要求可能会被取消。OpenCL规范本身没有涵盖这一点,只是将您重定向到ISO C99规范(如果内存可用的话,在前几页的某个地方)。因此,C99规则适用:您不需要初始化变量,但如果不需要,则内容是未定义的。我讨厌necro这一点,但我认为这实际上不是真的:这个so answer()表明不允许使用空的初始化器。在规范中没有找到相关的东西,但他提出了一个很好的论点。也许OpenCLC规范对此有不同的说法?@bobismijnnaam很好,我已经编辑了我的答案。我在C++中思考,它允许空初始化器。
float accum[SIZE];
for(int i=0; i<SIZE; ++i) accum[i] = 0;