작업 항목의 변수 쌍의 합계를 계산해야합니다. 내 사용 사례의 경우 그룹 크기는 {8}이며 작업 항목 쌍의 합계 [0,1], [2,3], [4,5], [6,7]을 계산해야합니다. 나는이 합을 커널 함수에 의해 호출되는 지역 함수에서한다._local 메모리에 액세스하면 CL_INVALID_PROGRAM_EXECUTABLE이됩니다.
부분 번호 : 상기 코드
__local float localSum[8];
int lid = get_local_id(0);
localSum[lid] = var;
barrier(CLK_LOCAL_MEM_FENCE);
if (lid % 2 == 0) {
localSum[lid] += localSum[lid+1];
// localSum[lid] = 0.f; //Incorrect implementation but works
}
커널 대기열에 후에는 CL_INVALID_PROGRAM_EXECUTABLE을 준다. clGetProgramBuildInfo를 사용하여 디버깅을 시도하여 커널 컴파일이 제대로되었는지 확인했습니다. 그리고 사용하지 않는 변수에 대한 몇 가지 경고 메시지 만 표시됩니다.
아래에 줄을 주석 처리하고 기능적으로 원하지 않는 줄의 주석을 제거하면 오류가 발생하지 않습니다.
이 코드에 문제가 있습니까? 내 유일한 추측은이 일을 지역 업무에서해서는 안된다는 것입니다. 커널 코드 대 로컬 함수에서 수행 할 수없는 것에 대한 제한이 있습니까?
나는 그냥 내 추측을 시도했다. 그리고 그것은 작동합니다. 커널 함수에서 __local float localSum [8]을 선언하고 get_local_id가 반환 한 포인터와 thread-id를 전달합니다. 그러나 문제는 여전히 남아 있습니다. 지역 기능에서 수행 할 수있는 것에 대한 제한은 무엇입니까? – Tanmay
지역 및 글로벌 작업 그룹 규모는 무엇입니까? – kanna
로컬 크기는 {8}입니다. 전체 크기는 {h * localSize [0]}입니다. 여기서 h는 작업 부하 크기에 따라 동적입니다. – Tanmay