【问题标题】:#OPENCL#clBuildProgram failed with error code -5#OPENCL#clBuildProgram 失败,错误代码 -5
【发布时间】:2018-11-29 21:48:19
【问题描述】:

在 GTX 750 上使用 clBuildProgram() 时遇到问题。内核无法构建,错误代码为 -5(CL_OUT_OF_RESOURCES),构建日志为空。

有一个可能的解决方案,即在 clBuildProgram() 中添加“-cl-nv-verbose”作为输入选项。但是,它不适用于所有内核。 基于此,我尝试了另一个优化选项“-cl-opt-disable”。它也适用于某些内核。

然后我就糊涂了。

  1. 我找不到导致错误的真正原因;
  2. 为什么不同的构建选项对某些内核有意义?
  3. 该错误似乎与架构无关。因为相同的 Opencl 代码在 GTX 750 上成功执行,而在 Tesla P100 上失败。

有人有想法吗?

【问题讨论】:

  • 另一个问题,我拿了一个简单的opencl基准——矩阵乘法。在没有任何构建选项输入的情况下构建内核。然后我写了一个python脚本来执行它。使用 sudo python script.py 不会出错,但是只使用 python 脚本也会出错。

标签: opencl gpu


【解决方案1】:

我能想到的可能原因:

  1. 寄存器用完。如果内核代码中有很多 (private) 变量,尤其是数组,就会发生这种情况。每个内核只有一定数量的可用寄存器(取决于架构),编译器可能无法将它们“溢出”到全局内存。如果这是问题所在,您可以尝试重新排列代码以使变量的范围更有限,或者您可以尝试将一些数组移动到 local 内存(请记住,这是在组中的工作项之间共享的,并且大小有限)。一个好的 GPU 分析器/代码分析工具应该能够告诉你有多少寄存器压力,所以如果你的内核在某些硬件上工作,你应该能够找出寄存器压力,并得出结论其他硬件也是如此。

  2. 代码大小本身。我认为这在现代 GPU 上应该不再是什么大问题,但如果你有真正巨大的内核,这可能是可能的。

【讨论】:

  • 2) 在现代 GPU 上使用某种形式的模板时仍然会发生(一遍又一遍地使用相同的内核,但在同一个文件中略有不同)
  • 您能推荐我一款 GPU Profiler 分析工具吗?我想测试一下注册压力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
相关资源
最近更新 更多