2011-08-21 5 views
2

그래서 같은 글로벌 (__constant) 구조체로 선언 몇 가지 일반적인 매개 변수가 있습니다 :OpenCL - 호스트에서 프로그램 범위 변수 초기화 중?

커널
typedef struct 
{ 
    int a; 
    int b; 
    float c; 
    /// blah blah 

} SomeParams; 

__constant SomeParams Parameters; 

, 정말처럼 사용할 필요가 :

__kernel void Foo() 
{ 
    int a = Parameters.a; 
    /// do something useful... 
} 

잘 모르겠어요 어떻게 커널을 실행하기 전에 호스트로부터 매개 변수의 값을 초기화 할 수 있습니까?

커널 인수에 버퍼 등을 만드는 데 문제가 없지만 커널 인수가 아니기 때문에 어떻게해야합니까?

Cloo C#/OpenCL 바인딩을 사용하고 있지만 원시 CL API도 도움이됩니다.

답변

5

필자가 아는 한 (그러나 이것으로는 맹세하지는 않습니다.) 그런 식으로 선언 된 호스트 코드에서 변수를 초기화 할 수는 없습니다 (한 가지 예외는 있음, 아래 참조). 당신은 변수를 선언하고 다음과 같이 초기화 할 수 :

커널 : 당신은 또한이 같은 뭔가를 할 수

__constant float pi = 3.14f; 

__constant float width = WIDTH

호스트 : 값을 정의하는 -D 빌드 매개 변수를 사용하여 커널 빌드 WIDTH입니다.

나는 과거에 커널 변수로 상수 변수를 사용했다.

__kernel void Foo(__constant SomeParams Parameters) 
{ 
    int a = Parameters.a; 
    /// do something useful... 
} 

그러면 다른 커널 인수와 마찬가지로 값을 할당하고 설정할 수 있습니다.

+0

감사합니다. 매개 변수 컬렉션을 전달하지 않아도되기를 바랬는데 (적어도 6 개의 다른 커널에서 사용됨), 이것이 실행 가능한 솔루션입니다. __constant가 각 코어에서 사용할 수있는 제한된 메모리에서 나오지 않는다는 점에서 맞습니까? –

+0

그 중 하나는 왜 컴파일러가 초기화되지 않은 전역 변수에 대한 경고를 표시하지 않는지 궁금합니다. –

+0

'CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE'와 함께'clGetDeviceInfo (...)'메소드를 사용하여 디바이스에서 상수 버퍼 (__constant로 표시된 변수)에 사용할 수있는 바이트 수를 얻을 수 있습니다. 'CL_DEVICE_LOCAL_MEM_SIZE'을 전달하여 장치 (__local로 표시된 변수)의 로컬 메모리 크기를 가져옵니다. 한 가지 더주의해야 할 사항은 커널에 전달할 수있는 __constant 매개 변수의 수에 제한이 있습니다. 그 수를 얻으려면,'CL_DEVICE_MAX_CONSTANT_ARGS'를 전달하십시오. OpenCL 사양은이 값의 최소값이 8이라고 명시하지만 (장치에 따라 더 많을 수도 있음) –