为什么这个障碍不起作用。 这应该在输出数组中产生1个长度的数字,它们的和在输出[0]中。如果我降低循环比例,这可以正常工作。在高规模下,线程应该在屏障处等待,但不要产生不正确的输出。
__kernel void b_test1( __global int* a, int length) {
int id = get_global_id(0);
const int scale = 100;
for (int i=0; i< id*scale; i++) a[id]=0; /* useless loops scaled up by id, just to waste time. note more time is wasted with bigger id */
a[id]=id;
barrier(CLK_GLOBAL_MEM_FENCE);
if (id==0){
int sum=0;
for (int i=0; i < length; i++){
sum+=a[i];
}
a[0]=sum;
}
}
我的java代码
CLContext context = JavaCL.createBestContext();
CLQueue queue = context.createDefaultQueue();
CLProgram program = context.createProgram(ReadText.readText(new File("src/kernel1.c")));
CLKernel kernel = program.createKernel("b_test1");
int length=10;
CLIntBuffer input = context.createIntBuffer(CLMem.Usage.InputOutput, length);
kernel.setArgs(input, length);
CLEvent event = kernel.enqueueNDRange(queue, new int[]{length}, new int[]{1});
queue.finish();
IntBuffer output = input.read(queue, event);
String out="";
for (int i=0; i< length; i++){
out+=output.get()+"\t";
}
System.out.println(out);
感谢。
编辑:我在win7上运行这个版本nvidia gtx 275 v270.61 opencl1.0&amp; Ubuntu nvidia 8600M GS
答案 0 :(得分:2)
同步功能对单个工作组内的所有线程进行操作。工作组以未指定的顺序独立执行。
要同步不同的工作组,您必须运行不同的内核,并指定它们之间的依赖关系(通过事件或障碍)。