2011-04-19 2 views
1

왜이 장벽이 작동하지 않습니다. 출력 배열의 길이가 1이고 길이가 출력 값 [0]에 있어야합니다. 루프 스케일을 낮추면 올바르게 작동합니다. 높은 스케일의 스레드는 장벽에서 대기해야하지만 잘못된 출력을 생성하지는 않습니다.opencl barrier가 작동하지 않음

__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; 
} 
} 

내 자바 코드

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); 

감사합니다.

편집 : 나는 275 v270.61 opencl1.0 & 우분투 엔비디아 8600M GS

답변

2

동기화 기능을 하나의 작업 그룹 내부의 모든 스레드 에서 작동 WIN7의 엔비디아 GTX에서이 작업을 실행했습니다. 작업 그룹은 지정되지 않은 순서로 독립적으로 실행됩니다.

다른 작업 그룹을 동기화하려면 다른 커널을 실행하고 이벤트 또는 장벽을 통해 종속성을 지정해야합니다.

+0

감사합니다. CLEvent event = kernel.enqueueNDRange (queue, new int [] {length}, new int [] {length});와 같은 이벤트를 생성해야합니다. – Stephen