내 커널에서 장벽을 사용하면 (CLK_LOCAL_MEM_FENCE
또는 CLK_GLOBAL_MEM_FENCE
) CL_INVALID_WORK_GROUP_SIZE
오류가 발생합니다. 전역 작업 크기는 512이고 로컬 작업 크기는 128이며 65536 항목을 계산해야하며 장치의 최대 작업 그룹 크기는 1024이며 한 차원 만 사용하고 있습니다. Java 바인딩의 경우 JOCL을 사용합니다. 커널은 매우 간단합니다 :장벽을 사용하면 CL_INVALID_WORK_GROUP_SIZE 오류가 발생합니다.
kernel void sum(global float *input, global float *output, const int numElements, local float *localCopy
{
localCopy[get_local_id(0)] = grid[get_global_id(0)];
barrier(CLK_LOCAL_MEM_FENCE); // or barrier(CLK_GLOBAL_MEM_FENCE)
}
나는 Intel(R) Xeon(R) CPU X5570 @ 2.93GHz
에 커널을 실행하고 오픈 CL 1.2을 사용할 수 있습니다. 호출하는 방법은
kernel.putArg(aCLBuffer).putArg(bCLBuffer).putArg(elementCount).putNullArg(localWorkSize);
queue.put1DRangeKernel(kernel, 0, globalWorkSize, localWorkSize);
처럼 보이지만 오류가 항상 동일합니다 : 내가 잘못 뭐하는 거지
[...]can not enqueue 1DRange CLKernel [...] with gwo: null gws: {512} lws: {128}
cond.: null events: null [error: CL_INVALID_WORK_GROUP_SIZE]
?
JOCL 바인딩에 익숙하지 않지만 putNullArg (localWorkSize) 호출은 로컬 메모리의 바이트를 할당하는 것으로 보입니다. 당신이 시도해야 할 것 : putNullArg (localWorkSize * 4), 또는 putNullArg (localWorkSize * sizeof (float)) – mfa
에 해당하는 것이 아니라면 localWorkSize가 이미 곱 해져서는 안된다고 생각해. – mfa
의견을 보내 주셔서 감사합니다. 그러나 불행히도 해결하지 못합니다. 문제. JOCL 문서는 바이트 크기 (http://goo.gl/ALkBLw)에 대해서는 단지 '크기'라고 말하지 않기 때문에 문제가 아님을 가정합니다. –