我有这个简单的内核用于测试。
__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];
}
似乎只是访问 a[0],而不分配给它自己会导致问题。
有谁知道发生了什么?
我在 Linux 上使用 AMD OpenCL 驱动程序(使用英特尔 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);