opencl屏障不起作用

时间:2011-04-19 04:13:17

标签: java parallel-processing opencl

为什么这个障碍不起作用。 这应该在输出数组中产生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

1 个答案:

答案 0 :(得分:2)

同步功能对单个工作组内的所有线程进行操作。工作组以未指定的顺序独立执行。

要同步不同的工作组,您必须运行不同的内核,并指定它们之间的依赖关系(通过事件或障碍)。