Kernel OpenCL内核总结

Kernel OpenCL内核总结,kernel,sum,opencl,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

我想知道这是否可行。。。我想检查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;" + 
            "}";
私有静态字符串程序源=
“uuu kernel void sampleKernel(uuu global const char*a,uuu global int*c){”+
“c[0]=0;c[1]=0;”+
“int gid=get_global_id(0);”+
“如果((a[gid]>64&&a[gid]<91)| |(a[gid]>96&&a[gid]<123))c[0]+=1;”+
“如果(a[gid]>47&&a[gid]<58)c[1]+=1;”+
"}";
这是我的密码。。。但在输出数组中,它总是数字1。。。 怎么了?这个问题的解决方案是什么


谢谢

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

一种解决方案是使用原子公司。原子_inc(c)代替c[0]+=1,原子_inc(c+1)代替c[1]+=1


接下来,由于您只有两个输出,将会有很多碰撞,这可能会非常缓慢。类似于约简的算法更可取。

如果我已经很好地理解了它,现在应该是这样:?if((a[gid]>64&&a[gid]<91)| |(a[gid]>96&&a[gid]<123))原子公司(c);如果(a[gid]>47&&a[gid]<58)原子公司(c+1)?谢谢