OpenCL内核总结

时间:2013-05-07 19:24:09

标签: kernel sum opencl

我想知道这是否可行...我想在java中检查内核内部,如果数组包含数字和字符,如果是,则保存它们在输出数组中出现的次数。

private static String programSource =
            "__kernel void sampleKernel(__global const char *a, __global int *c){" +
            "   c[0]=0; c[1]=0;"+
            "   int gid = get_global_id(0);" +
            "   if((a[gid] > 64 && a[gid] < 91) || (a[gid] > 96 && a[gid] < 123)) c[0]+=1; "+
            "   else if(a[gid] > 47 && a[gid] < 58) c[1]+=1;" + 
            "}";

这是我的代码...但在输出数组中它总是数字1 ... 怎么了?这个问题的解决方案是什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

所有工作项同时修改c [0]和c [1],导致输出错误。

一种解决方案是使用 atomic_inc 。 atomic_inc(c)代替c [0] + = 1,而atomic_inc(c + 1)代替c [1] + = 1。

接下来,由于你只有两个输出,会有很多碰撞,这可能会很慢。类似缩减的算法将更可取。