我正在尝试修复程序中的错误,并将其精确定位到非常小的区域。
每当我尝试将数据从设备的私有内存复制到全局内存中时,命令队列都会失效,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 :(得分:3)
如果宽度超过最大大小,私有内存就可以了。我建议您以 width = 8/16 运行内核,然后查看结果。如果您曾经为宽度传递一个大值。可能无法将所有数据保存在私有内存中。它们是寄存器,尺寸非常有限。