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

从专用内存复制到全局内存时出现OpenCL无效命令队列错误,opencl,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?

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

每当我试图将数据从设备的私有内存复制到全局内存时,命令队列就会失效,并且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];
        }
    }
}
内核无效示例(全局整数*数据,常量整数宽度){
int id=获取全局id(0);
如果(id==0){
int copy[width];//私有内存?
对于(int i=0;i
有人能解释一下原因吗


谢谢

如果宽度超过了最大大小,专用内存就可以了。例如,我建议您运行宽度为8/16的内核,并查看结果。如果过去传递的宽度值较大。可能无法在专用内存中保存所有数据。它们是寄存器,大小非常有限。

第一个循环中的第二条语句和第二个循环中的语句基本上做相同的事情。为什么?我认为编译器在这里起到了一定的作用。你用的是什么卡?英伟达还是AMD?。您可以查看一下PTX(如果是NVIDIA),看看它是否表示编译内核时出现的相同代码:
错误:openCL不支持可变长度数组int copy[width]可变长度数组。在1.2规范中,您可以在第6.9 d节中找到这一点。