从专用内存复制到全局时,OpenCL无效命令队列错误

时间:2012-02-12 00:37:11

标签: opencl

我正在尝试修复程序中的错误,并将其精确定位到非常小的区域。

每当我尝试将数据从设备的私有内存复制到全局内存中时,命令队列都会失效,clFinish()会返回错误。

考虑一个简单的例子:

kernel void example(global int *data, const int width) {
    int id = get_global_id(0);

    if (id == 0) {
        int copy[width]; // private memory?
        for (int i = 0; i < width; i++) {
            copy[i] = data[i]; // works
            data[i] = copy[i]; // works
        }

        // whenever this loop is here
        // i get invalid command queue from clFinish
        for (int i = 0; i < width; i++) {
            data[i] = copy[i];
        }
    }
}

有人可以向我解释为什么会这样?

谢谢

1 个答案:

答案 0 :(得分:3)

如果宽度超过最大大小,私有内存就可以了。我建议您以 width = 8/16 运行内核,然后查看结果。如果您曾经为宽度传递一个大值。可能无法将所有数据保存在私有内存中。它们是寄存器,尺寸非常有限。