2009-10-16 7 views
2

내 OpenCL 커널에서 __constant 한정자를 사용하는 데 문제가 있습니다. 내 플랫폼은 Snow Leopard입니다.OpenCL 커널에서 __constant qualifer 사용

GPU에서 CL 읽기 전용 메모리 개체를 초기화하여 호스트의 일정한 배열을 호스트로 복사하려고했습니다. 그런 다음 커널 인수를 __global 메모리 인수와 같이 설정합니다. 그러나 이것은 정상적으로 작동하지 않지만 오류나 경고는 표시되지 않습니다. 나는 또한 floatint 유형과 같이 clSetKernelArg 함수에서 직접 데이터를 사용하려고 시도했지만 작동하지 않습니다.

실수를 저질렀거나 Apple의 구현에 이상이 있습니까? OpenCL (gpu)과 호스트 코드가 어떻게 작동하는지 예제를보고 싶습니다.

답변

4

저는 애플의 구현에있어 근본적인 문제가 있다고 생각합니다. 다음과 같은 OpenCL Hello World Example 응용 프로그램을 사용하여 기본 정보를 얻었습니다.

이 예에서는 __global float* input__constant float* input으로 바꿨고 정상적으로 작동했습니다. 또한 clCreateBuffer(context, CL_MEM_READ_ONLY, sizeof(float) * count, NULL, NULL)과 같은 것을 사용하여 버퍼가 CL_MEM_READ_ONLY인지 확인해야합니다.

스펙을 읽는 것으로부터 저는 __constant => __global + CL_MEM_READ_ONLY라고 생각합니다.

나는 MBP 15 "에 스노우 레오파드를 실행하고 있습니다.

3

GPU에서 __constant 변수를 처리하는 애플의 오픈 CL 컴파일러 방식에 몇 가지 버그가 있습니다. 컴파일러 로그

OpenCL Build Error : Compiler build log: 
Error while compiling the ptx module: CLH_ERROR_NO_BINARY_FOR_GPU 
PTX Info log: 
PTX Error log: 

같은 것을 말한다면 그때 나는 당신과 같은 오류가 있었고 그것에 버그를 제기했다. 애플의 사람들은 그것을 (rdar : // 7217974의 중복으로) 표시 했으므로 나는 알려진 문제라고 여기고 그들은 그것에 대해 연구 중이다.

3

"사양을 읽으면 __constant =>라고 생각합니다. __global + CL_MEM_READ_ONLY "

__global 대신 _constant를 지정하면이 데이터를 메모리의 다른 부분에 저장하라는 메시지가 사용자에게 표시됩니다. 일부 장치에서는 그 사실이 동일 할 수 있지만 다른 장치는있을 수 없습니다. 예를 들어, NVIDIA 카드의 경우 __global의 경우 최대 64KB의 메모리와 mb의로드 만 있습니다. __constants의 장점은 NVIDIA 장치에서, 그것은 :) 캐시이다

당신은 당신의 장치를 조회 할 수 있습니다 (내 장치 쿼리의 예를)

CL_DEVICE_MAX_MEM_ALLOC_SIZE : 128 메가 바이트

CL_DEVICE_GLOBAL_MEM_SIZE : 255 메가 바이트

CL_DEVICE_LOCAL_MEM_SIZE : 된 16Kbyte

CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE 64 Kbyte이다

+0

** __constant 또는 constant 주소 공간 이름은 전역 메모리에 할당되고 커널 내에서 읽기 전용 변수 **로 액세스되는 변수를 설명하는 데 사용됩니다. OpenCL 스펙에서 나온 것입니다. 나는 OpenCL의 상수 메모리가 CUDA와 다르다고 생각한다. 나는 __global보다 __constant가 빠르지 않다는 것을 의미합니다. – Samuel