【问题标题】:OpenCl code works on a machine but I am getting CL_INVALID_KERNEL_ARGS on anotherOpenCl 代码在一台机器上工作,但我在另一台机器上得到 CL_INVALID_KERNEL_ARGS
【发布时间】:2013-12-13 09:04:20
【问题描述】:

我有以下代码,它在一台机器上运行良好,但是当我尝试在另一台显卡更好的机器上运行它时,我遇到了错误:

global[0] = 512; global[1] = 512;
local [0] = 16; local [1] = 16;
ciErrNum = clEnqueueNDRangeKernel(commandQueue, myKernel, 2, NULL, global, local, 0, NULL, &event);

错误:

Error @ clEnqueueNDRangeKernel: CL_INVALID_KERNEL_ARGS
Error @ clWaitForEvents: CL_INVALID_KERNEL_ARGS

知道是什么问题吗?

【问题讨论】:

  • 呃……那么……内核参数(以及内核本身)是什么?
  • @ChristianRau 我终于发现我在内核上使用的关键字__constant 只在我试过的三台机器中的两台上工作,我不知道为什么。当我在内核上将其更改为__global 时,它可以在第三个上运行。
  • 恒定内存是一种稀缺且有限的资源。也许您的第三台设备的固定内存很少。

标签: c++ c opencl


【解决方案1】:

您传递的缓冲区对象有多大? __constant 参数是从单独的内存空间分配的,而不是从全局内存分配的,因此您可能已经用完了常量内存。

规范要求设备在完整配置文件中必须支持至少 4 个 __constant 参数,总大小为 64kB。在嵌入式配置文件中,它降至 1kB。

您可以通过使用clGetDeviceInfo 检查CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE 来查询可用的常量内存量。您的设备很可能支持超出此最低要求的方式。

在大多数情况下,如果可以的话,您应该使用常量缓冲区,因为通常它比全局内存快很多。

以后您应该就您的问题提供更多信息。因为如果错误是CL_INVALID_KERNEL_ARGS,那么你真的需要知道内核的参数是什么。

【讨论】:

  • 一项修改:在完整规范(1.0 和 1.1)中,最小的常量内存量为 16kB。 1.2 版规定为 64kB,但并非对所有供应商都可用。
  • 你确定?检查khronos.org/registry/cl/specs/opencl-1.1.pdf 并显示 64kB。 khronos.org/registry/cl/specs/opencl-1.0.pdf 也表示相同。然而我确实犯了一个错误。支持的常量参数的数量必须至少为 8。
  • 对不起我的错误,我所说的适用于“本地”内存而不是“恒定”内存。感谢您的检查。
  • 哇,我有 2 天时间试图弄清楚在类似情况下发生了什么......这是恒定内存的 64kb 限制(我不知道)。谢谢,@sharpneli
猜你喜欢
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
相关资源
最近更新 更多