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