2014-05-12 111 views
0

我尝试启动至少有很多参数的空内核,但在函数enqueueNDRangeKernel中出现内存访问冲突。请检查我的代码,也许我错过了一些东西或者只是不知道。OpenCL中的访问冲突错误enqueueNDRangeKernel

主机代码: https://dl.dropboxusercontent.com/u/71256314/main.cpp 起初去一些初始化,然后我创建缓冲区,然后设置参数。没有错误出现。它在第一次enqueueNDRangeKernel函数调用时崩溃。

内核代码: https://dl.dropboxusercontent.com/u/71256314/baum_kernel.cl 即使内核为空,它也不起作用。

缓冲区的一些问题我猜,但没有错误返回。

版本: AMD APP SDK 2.8版 - AMD催化剂™12.10(9.002) GPU:ATI的Mobility Radeon HD 5650

+1

检查编译和库链接。这看起来像程序没有正确链接到OpenCL。 API不应该以这种方式崩溃。 – DarkZeros

+0

@DarkZeros我不认为这是问题。我在VS 2012中设置了项目,就像它在这里描述的一样(对于x64系统): http://kode-stuff.blogspot.ru/2012/11/setting-up-opencl-in-visual-studio_1.html I试图用这种配置运行简单的helloworld示例,并且它们运行良好。 –

+0

Sry告诉你他们放置的Hello world示例是无用的,只是调用一个不运行的OpenCL函数(只返回一些ID)。即使它起作用,链接也可能是错误的。您遇到的错误的典型问题是链接错误的库版本或以错误的方式动态加载它。 – DarkZeros

回答

1

1)问题是行

err = kernel.setArg(11, Otr); checkErr(err, "Kernel::setArg()11"); 

我是路过指向浮动Otr而不是将相应的OpenCL缓冲区Otr_b传递给setArg函数。 OpenCL一直在试图将指针复制到期望缓冲区的内核。毫无疑问存在访问违规错误。


2)DarkZeros提到的另一个重要的一点:检查你的库链接,也ATI驱动程序和AMD APP SDK版本之间的对应关系。以下是列出驱动程序和SDK兼容性的链接:Versions of AMD APP SDK。我的情况是我的AMD APP SDK v2.8.1与12.10(9.002)驱动程序不兼容。我最终安装了v2.8.0版本。