2011-04-19 90 views
1

为什么不能使用此屏障。 这应该在输出数组中产生1个长度的数字,它们的和在输出[0]中。如果我降低循环缩放这可以正常工作。如果线程规模较大,应等待屏障,但不要产生不正确的输出。opencl屏障无法正常工作

__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 & Ubuntu的NVIDIA 8600M GS

回答

2

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

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

+0

啊谢谢,所以我需要创建类似于'CLEvent event = kernel.enqueueNDRange(queue,new int [] {length},new int [] {length}); – Stephen 2011-04-19 14:23:10