我目前正在使用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 [] - 数组但组合失败。
所以我的问题是:
我感谢任何评论。
答案 0 :(得分:1)
嘿,我是Sven的同事,
我们发现了这个问题。它不像我们想象的那样是一个内存问题,它更像是一个语义错误。
在循环内部,我们必须使用if语句。这个if语句不会像在CPU上那样被评估,我们需要为if的每个分支使用一个线程。所以我们必须将本地工作组大小从1更改为至少2。 这样所有线程都运行if if为true并且所有false都带有false语句。错误的人将被抛弃。
这会导致NVIDIA显卡出错,但我不知道原因。我们还测试了另一张同样抛出-5(CL_OUT_OF_RESSOURCES)的NVIDIA卡。 我们使用的AMD卡有效,但更慢了。
非常感谢你的评论,并提供了大量的提示。但解决方案是设立一个更大的本地工作组来使其发挥作用。