【发布时间】:2014-11-11 16:50:03
【问题描述】:
我目前正在使用 OpenCL 并尝试将数据写入一个数组,该数组随后将被 CPU 使用。本地工作组大小为“1”,全局工作组大小为数组大小。 kernel.cl 中的问题如下:
__kernel void foo (..., __global int *a){
int test_array[2];
for (int i = 0; i<20; i++){
... // do something here
}
test_array[0] = 5;
int test = test_array[1];
a[gid] = test; // this throws an error at the graphical unit
a[gid] = test_array[0] // but this works if we assign test_array after the for-loop
当错误发生时,屏幕会变黑一秒钟并返回错误代码“-5”(CL_OUT_OF_RESSOURCES),但这似乎是 Nvidia 默认错误代码。
对 test_array (int test..) 的读取表明我们能够读取它,并且 a[gid]=test_array[0] 表明我们能够访问 a[]-array 但组合失败。
所以我的问题是:
- 为什么我们不能在for循环之后将数据从test_array复制到a[]-array?
我感谢任何 cmets。
【问题讨论】:
-
Why can't we copy the data from the test_array to the a[]-array after the for-loop.您所做的只是在更改源代码时移动内存损坏错误。它与 int 和 int 数组条目之间的区别无关。所以问题是你在某处损坏了内存,你需要弄清楚在哪里。所以我给你的建议是确保错误仍然存在(不要通过进行多余的编码更改来隐藏它),然后修复问题。 -
我看不出这不适合您的原因。它在其他gpus上会失败吗?这可能是实现中的错误。如果您可以访问 Intel HD 显卡或 AMD/ATI 设备,那么尝试将其用于调试目的将非常有用。也许需要向 Nvidia 提交错误?也许您的特定设备有问题?
-
我同意@PaulMcKenzie。或者换一种说法,它是在你遗漏的“在这里做点什么”部分。
-
@PaulMcKenzie /mfa:感谢您的快速回复。我们尝试在 AMD 设备上执行此操作,并且成功了。但我们也想在 Nvidia 设备上运行它(不使用 CUDA)。我们在 Nvidia 设备上确实存在此问题(在两台不同计算机上的同一 Nvidia 卡上测试),但在测试的 AMD 设备上没有。 do-part 仅在进行一些检查后用整数值填充测试数组。
-
也许这是你的问题?在一直运行到 20 的循环中填充大小为 2 的“测试数组”,并将值写入数组边界之外。 Nvidia OpenCL 错误代码并不总是符合标准,尤其是 -5。