2017-10-29 1 views
0

작업 항목의 변수 쌍의 합계를 계산해야합니다. 내 사용 사례의 경우 그룹 크기는 {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를 사용하여 디버깅을 시도하여 커널 컴파일이 제대로되었는지 확인했습니다. 그리고 사용하지 않는 변수에 대한 몇 가지 경고 메시지 만 표시됩니다.

아래에 줄을 주석 처리하고 기능적으로 원하지 않는 줄의 주석을 제거하면 오류가 발생하지 않습니다.

이 코드에 문제가 있습니까? 내 유일한 추측은이 일을 지역 업무에서해서는 안된다는 것입니다. 커널 코드 대 로컬 함수에서 수행 할 수없는 것에 대한 제한이 있습니까?

+0

나는 그냥 내 추측을 시도했다. 그리고 그것은 작동합니다. 커널 함수에서 __local float localSum [8]을 선언하고 get_local_id가 반환 한 포인터와 thread-id를 전달합니다. 그러나 문제는 여전히 남아 있습니다. 지역 기능에서 수행 할 수있는 것에 대한 제한은 무엇입니까? – Tanmay

+0

지역 및 글로벌 작업 그룹 규모는 무엇입니까? – kanna

+0

로컬 크기는 {8}입니다. 전체 크기는 {h * localSize [0]}입니다. 여기서 h는 작업 부하 크기에 따라 동적입니다. – Tanmay

답변

0

장치 측면의 경우 __local 주소 공간은 커널 기능 내에서만 할당 할 수 있으며 여기서부터 호출하는 다른 장치 기능은 할당 할 수 없습니다. OpenCL Reference에서 관련 발췌 한 다음 __local 주소 공간에

포인터 (커널 함수 포함) 함수의 인수로 사용할 수 있습니다. 커널 함수 내에서 __ 로컬 주소 공간에 할당 된 변수는 커널 함수 범위에서 발생해야합니다.

그러나 커널 함수에서 변수를 할당 한 다음 포인터를 전달할 수 있습니다. 예 :

kernel void test() { 
    __local float localSum[8]; 
    calculate(localSum); 
} 

void calculate(__local float *localSum) { 
    size_t lid = get_local_id(0); 
    localSum[lid] = 0; 
    barrier(CLK_LOCAL_MEM_FENCE); 
    if (lid % 2 == 0) { 
     localSum[lid] += localSum[lid+1]; 
     localSum[lid] = 0.f; //Incorrect implementation but works 
    } 
} 
관련 문제