OpenCL 커널에서 메모리 할당, 루프 반복 횟수 등을 관리하는 많은 상수가 있습니다. 전역 __constants 또는 #define을 사용하는 것이 더 빠릅니까?OpenCL __constant vs #define
2
A
답변
4
"일반"C 컴파일러와 동일한 규칙이 OpenCL 컴파일러에 적용됩니다. 은 실제 컴파일시 전에 값으로 바뀌므로 커널에 구워집니다.
정의에 따라 __constant
변수가 전역 메모리에 할당되며 사용하기 전에 전송해야합니다. 이것은 #define
d 리터럴을 사용하는 것보다 느립니다. 그러나 NVIDIA 및 AMD의 GPU 아키텍처는 이러한 값을 캐싱하고 일반 전역 메모리보다 읽기가 빠릅니다.
기사 끝 및 저의 개인적인 조언 : 더 빠른 고속이지만 읽기 전용 메모리 블록 (예 : 찾아보기 테이블)의 경우 "마법"숫자와 마찬가지로 __constant
메모리를 사용하여 상수 값은 #defines
을 사용하십시오.
1
define은 C에서와 같은 방식으로 작동합니다. 예외적으로 AMD APP SDK v2.8 (OpenCL 1.2가 지원되지 않음) 이전의 모든 버전이 예외입니다.
__Constant는 캐시 된 메모리 공간입니다. OpenCL의 메모리 레이아웃에 대한 자세한 내용을 읽어보십시오.
__global은 모든 스레드에서 볼 수있는 GPU의 총 메모리입니다.
__local은 GPU의 로컬 메모리이며 블록 내부의 스레드에서만 볼 수 있습니다.
__constant는 전역 메모리이지만 제한적이므로 훨씬 빠르게 캐시 된 메모리이므로 필요한 경우에만 사용하십시오.
__private는 개별 스레드에서만 볼 수있는 GPU의 개인 메모리입니다.
참고 : 스레드는 처리 요소를 의미합니다.
관련 문제
- 1. OpenCL : __constant 대 __local?
- 2. OpenCL 커널에서 __constant qualifer 사용
- 3. OpenCL AMD vs NVIDIA 성능
- 4. 임베디드 환경에서 #define vs enum (컴파일 방법)
- 5. OpenCL 커널이 벡터화되지 않았습니다.
- 6. OpenCl Vs Java를 사용한 이질 컴퓨팅 java
- 7. OpenCL - 벡터화 vs 스레드 내 루프
- 8. OpenCL : sincos vs native_cos 및 native_sin
- 9. #DEFINE,
- 10. #DEFINE
- 11. #define
- 12. OpenCL - 호스트에서 프로그램 범위 변수 초기화 중?
- 13. define 문에 define 문을 사용합니다.
- 14. OpenCL 전역 배열
- 15. OpenCL SHA1 처리량 최적화
- 16. 인텔 OpenCL 대. Khronos OpenCL
- 17. OpenCL 1.2로 OpenCL 1.1 시뮬레이트
- 18. #define in #define; 전처리 기는 어떻게됩니까?
- 19. OpenCL : NVIDIA의 벡터 레지스터 (float4, float8, ..) VS 인텔의 벡터 레지스터
- 20. #DEFINE 문
- 21. #define 설명문
- 22. #include를 사용하여 OpenCL 코드로드
- 23. OpenCL 성능 최적화
- 24. opencl 섹션에서 Opencl 독립 큐와 clFinish
- 25. 다른 OpenCL 커널에서 OpenCL 커널 호출
- 26. OpenCL 이상한 커널 동작
- 27. opencl 동기화
- 28. Hadoop이있는 OpenCL
- 29. pthreads와 opencl
- 30. OpenCL : 가변 길이의 배열 출력
저는 상수 메모리를 전송해야한다는 사실을 제외하고는 말한 것에 동의합니다. 나는 이것을 결코 처리하지 못했다. 상수 메모리를 사용하는 유일한 방법은 #define ...을 사용하여 큰 상수 배열의 값을 정의하는 것이 었습니다. –
다른 메모리 버퍼와 마찬가지로 상수 메모리 버퍼를 만들었지 만 CL_MEM_READ_ONLY 플래그가 설정되어 있습니다. 그것을 전송하기 위해서는'CL_MEM_COPY_HOST_PTR' 플래그를 사용하거나'clEnqueueWriteBuffer'와 함께 보통 때처럼 복사하십시오. – matthias
__constant 버퍼를 사용하는 경우 Device Info 속성 CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE를 확인하여 최대 버퍼 크기를 유지해야합니다. –