gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:35:59 25 4
gpt4 key购买 nike

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

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

最佳答案

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

调用 cl::Buffer 的参数的最后一个类型是 void*。您想要的是指向您传入的内存块的指针,在本例中为数组(由于数组而自动转换为指针)。您已将一个指针 传递给数组(即指向指针的指针),它被编译器悄悄地转换为void*。这意味着,您最终复制了数组指针,然后复制了内存中的 2 个整数。我可以想象这会导致糟糕的结果

我不确定为什么 a=a 或 output = a[1] 会修复它,因为我没有执行 CPU OpenCL 的经验,而且我不确定具体的工作原理。在 GPU 上,您可能可以将其解释为设备出于性能原因缓存内存,从而防止发生内存失效(或其他情况)

编辑:哎呀,才发现这是多大了,我应该好好读书

关于c - OpenCL。数组寻址/指针的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11515601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com