- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有这个用于测试的简单内核。
__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/
我有这种来自 Google map 自动完成的奇怪行为(或者我可能错过了某事)...想法?奇怪的: 您在输入中输入某物,例如“伦敦” 您按 [ENTER] 你按下 [CLEAR] 按钮 你点击进入'输
这段代码与《Learning Java》(Oracle Press Books)一书中的代码完全一样,但它不起作用。我不明白为什么它不起作用,它应该起作用。我用 OpenJDK 和 Sun JDK 7
示例 1 中究竟发生了什么?这是如何解析的? # doesnt split on , [String]::Join(",",("aaaaa,aaaaa,aaaaa,aaaaa,aaaaa,aa
我需要获得方程式系统的解决方案。为此,我使用函数sgesv_()。 一切都很好,它使我感到解决方案的正确结果。 但是我得到一个奇怪的警告。 警告:从不兼容的指针类型传递'sgesv_'的参数3 我正在
我目前在制作动画时遇到一个奇怪的问题: [UIView animateWithDuration:3 delay:0
alert('works'); $(window).load(function () { alert('does not work'); });
我的代码: public class MyTest { public class StringSorter implements Comparator { public
我正在学习 JavaScript。尝试理解代码, function foo (){ var a = b = {name: 'Hai'}; document.write(a.name +''
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
这按预期工作: [dgorur@ted ~]$ env -i env [dgorur@ted ~]$ 这样做: [dgorur@ted ~]$ env -i which date which: no
struct BLA { int size_; int size()const{ return size_; } } int x; BLA b[ 2 ]; BLA * p = &b[
我有以下代码: #test img {vertical-align: middle;} div#test { border: 1px solid green; height: 150px; li
我想大多数使用过 C/C++ 的人都对预处理器的工作原理有一定的直觉(或多或少)。直到今天我也是这么认为的,但事实证明我的直觉是错误的。故事是这样的: 今天我尝试了一些东西,但我无法解释结果。首先考虑
我想为 TnSettings 做 mock,是的,如果通过以下方法编写代码,它就可以工作,问题是我们需要为每个案例编写 mock 代码,如果我们只 mock 一次然后执行多个案例,那么第二个将报告异常
我的项目中有以下两个结构 typedef volatile struct { unsigned char rx_buf[MAX_UART_BUF]; //Input buffer over U
Regex rx = new Regex(@"[+-]"); string[] substrings = rx.Split(expression); expression = "-9a3dcb
我的两个应用程序遇到了一个奇怪的问题。这是设置: 两个 tomcat/java 应用程序,在同一个网络中运行,连接到相同的 MS-SQL-Server。一个应用程序,恰好按顺序位于 DMZ 中可从互联
我目前正在与 Android Api Lvl 8 上的 OnLongClickListener 作斗争。 拿这段代码: this.webView.setOnLongClickListener(new
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
只是遇到了奇怪的事情。我有以下代码: -(void)ImageDownloadCompleat { [self performSelectorOnMainThread:@selector(up
我是一名优秀的程序员,十分优秀!