OpenCL的。 奇怪的数组寻址/指针错误

我有这个简单的内核进行testing。

__kernel void nfa(__global const int *a, __global int *output) { output[0] = a[0]; } 

注意:这是在CPU上运行,内存可能在主机上。 它导致这个错误。

* glibc检测到 ./program:malloc():smallbin双链表损坏:0x0000000000a4a540 * *

我怀疑这是破坏程序的一部分,因为它正在访问主机内存。 但据我所知,所有内存分配正确。 它在堆栈上,但在运行时停留在范围内。

但是,如果我这样做:

  __kernel void nfa(__global const int *a, __global int *output) { a = a; output[0] = a[0]; } 

这导致答案2,这是正确的,因为a是一个数组[2,4,8];

对自己的分配解决了这个问题…

这也很好,导致4。

  __kernel void nfa(__global const int *a, __global int *output) { output[0] = a[1]; } 

似乎只是访问一个[0],而不分配给自己导致的问题。

有谁知道发生了什么事?

我在Linux上与AMD OpenCL驱动程序(与英特尔CPU,但我有一个AMD卡)。

编辑:

缓冲区创build的代码(缩写,数组和缓冲区之间有其他代码):

 int a[3]; a[0] = 2; a[1] = 4; a[2] = 8; cl::Buffer bufferA = cl::Buffer(context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR , sizeof(int) * 3, &a); 

我可能是错的(我没有使用C ++ OpenCL,但我相信它大致相同的C绑定),但我相信:

最后一个类型调用cl :: Buffer的参数是void *。 你想要的是一个指向你传入的内存块的指针,在这种情况下,该数组(由于数组而自动转换为指针)。 你已经传入了一个指向数组的指针 (即指向指针的指针),这个指针被编译器静默地抛弃。 这意味着,你最终复制数组指针,然后不管发生了什么,在内存中2整数。 我可以想象这会造成糟糕的结果

我不知道为什么a = a或output = a [1]可以修复它,因为我没有CPU OpenCL的经验,我不确定具体是如何工作的。 在GPU上,您可能会将其解释为设备为了性能原因缓存内存,从而防止发生内存失效(或某事)

编辑:哎呀,刚刚意识到这是多大年纪,我应该学会更好地阅读