OpenCL内存访问

时间:2014-11-11 16:50:04

标签: c++ c opencl nvidia

我目前正在使用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 ..)的读取显示我们能够读取它并且[gid] = test_array [0]显示我们能够访问a [] - 数组但组合失败。

所以我的问题是:

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

我感谢任何评论。

1 个答案:

答案 0 :(得分:1)

嘿,我是Sven的同事,

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

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

这会导致NVIDIA显卡出错,但我不知道原因。我们还测试了另一张同样抛出-5(CL_OUT_OF_RESSOURCES)的NVIDIA卡。 我们使用的AMD卡有效,但更慢了。

非常感谢你的评论,并提供了大量的提示。但解决方案是设立一个更大的本地工作组来使其发挥作用。

相关问题