2014-01-24 2 views
2

Opencl은 재귀 함수를 지원하지 않지만 간접 버전도 지원합니까? 대신 그래서 OpenCL 및 간접 재귀

void recurse(int *a, int b) 
{ 
    a[b]=3; 
    if(b<10) 
    { 
     recurse(a,b+1); // some OpenCL devices does not have the ability so this is not 
         // possible in OpenCL 
    } 

} 

void recursiveA(int *a,int b) // call this first to start recursion 
{ 
    a[b]=3; 
    if(b<10) 
    { 
     recursiveB(a,b+1); // A calls B 
    } 
} 


void recursiveB(int *a, int b) 
{ 
    a[b]=3; 
    if(b<10) 
    { 
     recursiveA(a,b+1); // B calls A while A still not finished before 
          // and entry point & arguments of A are corrupt ? 
    } 

} 

, 우리는 먼저 "R"이 완료되지 않은 경우에도 다른 함수에서 "R"함수를 호출 할 수 있습니다? 이러한 함수는 우리가 호출 할 때마다 인수에 대해서만 같은 상수 주소를 사용합니까? OpenCL 2.0이 출시 될 때까지 간접적 인 재귀를 수행하려면 사용자 정의 "스택"구현을 사용해야합니까?

답변

7

OpenCL은 상호 재귀를 포함하는 재귀 제어 흐름을 지원하지 않습니다. 따라서 목표로 삼을 수있는 모든 플랫폼에서 코드가 올바르게 작동하도록하려면 반복적 인 방식을 사용하지 말고 반복 접근 방식을 사용하여 알고리즘을 작성해야합니다.

실제로 OpenCL 컴파일러는 특정 재귀 알고리즘을 잘 처리 할 수 ​​있습니다. 예를 들어 함수가 tail-recurisve 인 경우 컴파일러는 표준 테일 호출 최적화 기술을 적용하여 비회원 양식을 생성 할 수 있습니다. 방금 게시 한 두 번째 재귀 코드 스 니펫을 시도했으며 여러 OpenCL 컴파일러에서이를 수용했습니다. 첫 번째 코드 단편은 모두 충돌로 이어져 재귀 호출을 피하기 위해 필요한 변환을 적용 할 수 없다는 것을 나타냅니다. 단점은 충돌이 아닌 적합한 오류 메시지를 생성해야한다는 것입니다.

일부 OpenCL 구현에서 간단한 재귀를 사용하지 않을 수도 있지만 다른 플랫폼에서 최대한의 이식성을 유지하려면 사용하지 않는 것이 좋습니다.