【问题标题】:Access violation error in OpenCL enqueueNDRangeKernelOpenCL enqueueNDRangeKernel 中的访问冲突错误
【发布时间】:2023-03-28 14:51:01
【问题描述】:

我尝试至少启动带有很多参数的空内核,但我在函数 enqueueNDRangeKernel 中遇到内存访问冲突。请检查我的代码,也许我错过了什么或者只是不知道。

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

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

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

版本: AMD APP SDK v2.8 — AMD Catalyst™ 12.10 (9.002) GPU:ATI Mobility Radeon HD 5650

【问题讨论】:

  • 检查编译和库链接。这看起来程序没有正确链接到 OpenCL。 API 绝不应该以这种方式崩溃。
  • @DarkZeros 我认为这不是问题所在。我在 VS 2012 中设置了项目,就像这里描述的那样(对于 x64 系统):kode-stuff.blogspot.ru/2012/11/… 我尝试使用此配置运行简单的 helloworld 示例,它们运行良好。
  • 不好意思告诉你,他们放的 Hello world 例子没用,只是调用了一个什么都不运行的 OpenCL 函数(只是返回一些 ID)。即使它有效,链接也可能是错误的。您遇到的错误的典型问题是链接错误的库版本或以错误的方式动态加载它。
  • @DarkZeros,好的,谢谢!我发现 SDK 版本实际上是 2.8.1,它适用于较新的驱动程序。所以我将 SDK 降级到 2.8.0,现在它不会崩溃。现在我有错误 CL_INVALID_WORK_ITEM_SIZE,但是我将 1000 作为全局 NDRange 和 100 作为本地 NDRange 传递,而 CL_DEVICE_MAX_WORK_GROUP_SIZE 是 256。
  • @DarkZeros 现在它再次因访问冲突而崩溃 =( 我尝试从 Documents\AMD APP\samples\opencl 启动样本,它们工作正常,甚至不是简单的。即使在 x32 设置下。什么可以吗?访问冲突在amdocl.dll中。

标签: kernel opencl gpu


【解决方案1】:

1) 问题出在一行

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

我将指针传递给 float 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版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多