【问题标题】:OpenCL Memory AccessOpenCL 内存访问
【发布时间】:2014-11-11 16:50:03
【问题描述】:

我目前正在使用 OpenCL 并尝试将数据写入一个数组,该数组随后将被 CPU 使用。本地工作组大小为“1”,全局工作组大小为数组大小。 kernel.cl 中的问题如下:

__kernel void foo (..., __global int *a){
 int test_array[2];
 for (int i = 0; i<20; i++){
  ... // do something here 
 }
 test_array[0] = 5;
 int test = test_array[1];

 a[gid] = test; // this throws an error at the graphical unit 
 a[gid] = test_array[0] // but this works if we assign test_array after the for-loop

当错误发生时,屏幕会变黑一秒钟并返回错误代码“-5”(CL_OUT_OF_RESSOURCES),但这似乎是 Nvidia 默认错误代码。

对 test_array (int test..) 的读取表明我们能够读取它,并且 a[gid]=test_array[0] 表明我们能够访问 a[]-array 但组合失败。

所以我的问题是:

  • 为什么我们不能在for循环之后将数据从test_array复制到a[]-array?

我感谢任何 cmets。

【问题讨论】:

  • Why can't we copy the data from the test_array to the a[]-array after the for-loop. 您所做的只是在更改源代码时移动内存损坏错误。它与 int 和 int 数组条目之间的区别无关。所以问题是你在某处损坏了内存,你需要弄清楚在哪里。所以我给你的建议是确保错误仍然存​​在(不要通过进行多余的编码更改来隐藏它),然后修复问题。
  • 我看不出这不适合您的原因。它在其他gpus上会失败吗?这可能是实现中的错误。如果您可以访问 Intel HD 显卡或 AMD/ATI 设备,那么尝试将其用于调试目的将非常有用。也许需要向 Nvidia 提交错误?也许您的特定设备有问题?
  • 我同意@PaulMcKenzie。或者换一种说法,它是在你遗漏的“在这里做点什么”部分。
  • @PaulMcKenzie /mfa:感谢您的快速回复。我们尝试在 AMD 设备上执行此操作,并且成功了。但我们也想在 Nvidia 设备上运行它(不使用 CUDA)。我们在 Nvidia 设备上确实存在此问题(在两台不同计算机上的同一 Nvidia 卡上测试),但在测试的 AMD 设备上没有。 do-part 仅在进行一些检查后用整数值填充测试数组。
  • 也许这是你的问题?在一直运行到 20 的循环中填充大小为 2 的“测试数组”,并将值写入数组边界之外。 Nvidia OpenCL 错误代码并不总是符合标准,尤其是 -5。

标签: c++ c opencl nvidia


【解决方案1】:

嘿,我是斯文的同事,

我们发现了问题。它不像我们想象的那样是一个记忆问题,它更像是一个语义错误。

在循环内部,我们必须使用 if 语句。这个 if 语句不会像在 CPU 上那样被评估,我们需要一个线程来处理 if 的每个分支。所以我们不得不将本地工作组的大小从 1 更改为至少 2。 这样所有线程都在 if 为 true 且全部为 false 的情况下运行。错误的将被丢弃。

这会导致 NVIDIA 卡出现错误,但我不知道为什么。我们还测试了另一张也抛出 -5(CL_OUT_OF_RESSOURCES) 的 NVIDIA 卡。 我们使用的 AMD 卡可以工作,但速度却很慢。

因此,感谢大家提供了很多提示的 cmets。但解决方案是建立一个更大的本地工作组来让它发挥作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    相关资源
    最近更新 更多