2013-02-27 1 views
2

OpenCL 커널에서 메모리 할당, 루프 반복 횟수 등을 관리하는 많은 상수가 있습니다. 전역 __constants 또는 #define을 사용하는 것이 더 빠릅니까?OpenCL __constant vs #define

답변

4

"일반"C 컴파일러와 동일한 규칙이 OpenCL 컴파일러에 적용됩니다. 은 실제 컴파일시 전에 값으로 바뀌므로 커널에 구워집니다.

정의에 따라 __constant 변수가 전역 메모리에 할당되며 사용하기 전에 전송해야합니다. 이것은 #define d 리터럴을 사용하는 것보다 느립니다. 그러나 NVIDIA 및 AMD의 GPU 아키텍처는 이러한 값을 캐싱하고 일반 전역 메모리보다 읽기가 빠릅니다.

기사 끝 및 저의 개인적인 조언 : 더 빠른 고속이지만 읽기 전용 메모리 블록 (예 : 찾아보기 테이블)의 경우 "마법"숫자와 마찬가지로 __constant 메모리를 사용하여 상수 값은 #defines을 사용하십시오.

+0

저는 상수 메모리를 전송해야한다는 사실을 제외하고는 말한 것에 동의합니다. 나는 이것을 결코 처리하지 못했다. 상수 메모리를 사용하는 유일한 방법은 #define ...을 사용하여 큰 상수 배열의 값을 정의하는 것이 었습니다. –

+0

다른 메모리 버퍼와 마찬가지로 상수 메모리 버퍼를 만들었지 만 CL_MEM_READ_ONLY 플래그가 설정되어 있습니다. 그것을 전송하기 위해서는'CL_MEM_COPY_HOST_PTR' 플래그를 사용하거나'clEnqueueWriteBuffer'와 함께 보통 때처럼 복사하십시오. – matthias

+0

__constant 버퍼를 사용하는 경우 Device Info 속성 CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE를 확인하여 최대 버퍼 크기를 유지해야합니다. –

1

define은 C에서와 같은 방식으로 작동합니다. 예외적으로 AMD APP SDK v2.8 (OpenCL 1.2가 지원되지 않음) 이전의 모든 버전이 예외입니다.

__Constant는 캐시 된 메모리 공간입니다. OpenCL의 메모리 레이아웃에 대한 자세한 내용을 읽어보십시오.

__global은 모든 스레드에서 볼 수있는 GPU의 총 메모리입니다.

__local은 GPU의 로컬 메모리이며 블록 내부의 스레드에서만 볼 수 있습니다.

__constant는 전역 메모리이지만 제한적이므로 훨씬 빠르게 캐시 된 메모리이므로 필요한 경우에만 사용하십시오.

__private는 개별 스레드에서만 볼 수있는 GPU의 개인 메모리입니다.

참고 : 스레드는 처리 요소를 의미합니다.