2012-02-12 27 views
1

我想修复程序中的错误,并将其指向真正的小区域。从私有内存复制到全局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]; 
     } 
    } 
} 

这样可以为什么,之所以有人给我解释一下?

谢谢

+0

第一个循环中的第二个语句和第二个循环中的语句基本上做同样的事情。为什么?。我在想编译器在这里扮演一些角色。你使用什么卡? NVIDIA或AMD ?.你可以看一看PTX(如果是NVIDIA),看它是否代表相同的代码 – nouveau 2012-02-12 14:00:02

+0

尝试编译内核会带来:'错误:openCL不支持可变长度数组 int copy [width];' – rdoubleui 2012-02-12 20:15:32

+3

可变长度根据规范不支持数组。在1.2规范中,您可以在6.9节中找到它。 – James 2012-02-14 00:23:47

回答

3

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

相关问题