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

时间:2012-07-17 03:24:06

标签: c linux arrays pointers opencl

我有这个简单的内核用于测试。

__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]而没有分配给它自己导致问题。

有谁知道发生了什么事?

我使用AMD OpenCL驱动程序使用Linux(使用intel CPU,但我有AMD卡)。

编辑:

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

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);

1 个答案:

答案 0 :(得分:1)

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

调用cl :: Buffer的参数的最后一个类型是void *。你想要的是一个指向你传入的内存块的指针,在这种情况下是数组(由于数组而自动转换为指针)。您已将指针传递给数组(即指向指针的指针),编译器会悄悄地将其转换为void *。这意味着,您最终复制数组指针,然后在内存中以2个整数形式发生的任何事情。我可以想象这导致了不好的结果

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

编辑:哎呀,刚刚意识到这有多久了,我应该学会更好地阅读