2011-06-14 7 views
4

나는 나의 인덱싱 코드를 명확하게하기 위해 커널 함수 내에서 함수를 정의 할 :OpenCL에서 커널 함수 내에서 함수를 선언하는 방법은 무엇입니까?

kernel void do_something (const int some_offset, 
          const int other_offset, 
          global float* buffer) 
{ 
    int index(int x, int y) 
    { 
     return some_offset+other_offset*x+y; 
    } 

    float value = buffer[index(1,2)]; 
    ... 
} 

그렇지 않으면 내가 좋아하는 내 커널과 인덱스 이외의 인덱스 함수를 선언해야 할 것

float value = buffer[index(1,2,some_offset,other_offset)]; 

그것은 더 추악하게 만들 것입니다. 이것을 할 방법이 있습니까? 컴파일러에서 다음과 같이 오류 메시지를 표시합니다.

OpenCL Compile Error: clBuildProgram failed (CL_BUILD_PROGRAM_FAILURE). 
Line 5: error: expected a ";" 

동일한 작업을 수행하는 것이 가능한지 또는 다른 방법이 있습니까? 감사합니다.

+1

C에는 어떤 종류의 폐쇄도 없습니다. 나는 OpenCL도 마찬가지라고 생각하지만, 원래 Apple의 것이므로 [블록] (http://en.wikipedia.org/wiki/Blocks_%28C_language_extension%29)을 사용할 수 있는지 확인하십시오. 이 경우,'some_offset'이 범위에 남아 있기 때문에 매크로를 사용할 수있는 것처럼 보입니다. –

답변

5

C는 중첩 된 기능을 지원하지 않습니다. 그러나 귀하의 경우 충분한 매크로로 구현 될 간단하다 : x와 y 주위

#define index(x,y) some_offset+other_offset*(x)+(y) 

괄호는, 예를 들어, index(a+b,c)을 매크로 좀 더 복잡한 표현을 전달하면 당신이 원하는 것을 할 수 있도록하는 것이 중요하다.

+0

훌륭한 사운드. 커널 함수 내에서 매크로를 정의해야합니까, 아니면 정의했는지는 중요하지 않습니까? –

+1

C에서 전처리는 컴파일하기 전에 수행되는 별도의 컴파일 단계입니다. 따라서 처음 사용하기 전에 어디에서나 정의 할 수 있습니다. (OpenCL에는 더 많은 제한이있을 수 있습니다.) – zvrba

+3

'(some_offset + other_offset * (x) + (y))'식 전체에 괄호를 붙여야합니다. 그렇지 않으면'index (x, y) * 2'는 놀라운 것을합니다. –

관련 문제