OpenCL Architecture
실행 모델(Execution Model)
- 호스트 프로그램이 커널 실행을 위해 "N-차원의 인덱스 공간"을 지정
- 인덱스 공간은 같은 크기의 하나 이상의 그룹으로 분할됨
- 그룹은 디바이스의 CU에서 실행됨
- 커널은 인덱스 공간의 각 지점에서 실행됨
- 각 지점은 하나 이상의 PE에서 실행됨
- 인덱스 공간은 같은 크기의 하나 이상의 그룹으로 분할됨
커널 인덱스 공간(Kernel Index Space)
NDRange
N 차원의 인덱스 공간(N : 1,2,3,)
전체 워크 아이템(work-item)의 수를 지정
- N 차원 튜플로 지정
- 워크 아이템은 커널 인스턴스
- 워크 아이템은 CUDA에서 스레드로 불림
각 워크 아이템은 인덱스 공간의 각 지점에서 실행
- 모든 워크 아이템은 병렬로 실행(모두 동시에 실행)
워크 그룹(Work-group)
- 워크 아이템의 집합
- 인덱스 공간을 분할하는 그룹
- CU에서 실행됨
- CPU의 경우
- 하나의 코어가 각 워크 아이템을 루프 형태로 실행
- GPU의 경우
- 하나의 SM이 여러 워크 그룹을 문맥 교환하며 실행
- CPU의 경우
- 모양 및 크기
- 모든 워크 그룹은 동일해야 함
- 성능에 큰 영향을 미침
- 알고리즘에 최적의 워크 그룹 차원과 크기를 찾는 것이 중요
- 선택 방법
- 프로그래머가 직접 코드에 지정
- 디바이스의 아키텍처와 커널 코드의 특성 고려
- OpenCL 런타임이 자동으로 선택
- 구현에 따라 다름
- 프로그래머가 직접 코드에 지정
워크 그룹과 워크 아이템 식별
- 인덱스 공간 : (Gx, Gy)
- 워크 그룹
- 크기 : (Sx, Sy)
- 워크 그룹 ID : (wx, wy)
- 워크 그룹 개수
- (Wx, Wy) = (Gx/Sx, Gy/Sy)
- 워크 아이템
- 글로벌 ID : (gx, gy)
- 인덱스 공간 내의 전역 ID
- 글로벌 ID 오프셋 : (Fx, Fy)
- 로컬 ID : (sx, sy)
- 워크 그룹 내에서의 ID
- (gx, gy) = (wx * Sx + sx + Fx, wy * Sy + sy + Fy)
- 글로벌 ID : (gx, gy)
커널의 종류
- OpenCL 커널
- OpenCL C로 작성하고 OpenCL 컴파일러로 컴파일한 것
- OpenCL 표준에서 필수
- 네이티브 커널(Native kernel)
- 어플리케이션 코드나 라이브러리의 함수
- 호스트에서 함수 포인터를 이용해 접근
- OpenCl 표준에서 옵션
커널 실행
- 커널 코드가 커널 인텍스 공간의 모든 지점에서 실행됨
- SPMD
- 인덱스 공간
- 데이터가 워크 아이템에 어떻게 매핑 되는지 정의하는 역할
컨텍스트(Context)
- OpenCL 컨텍스트
- 커널이 실행되는 환경
- 동기화와 메모리 관리가 정의되는 도메인
- 호스트 프로그램이 API clCreateContext()를 이용하여 생성
- 포함하는 리소스
- 디바이스
- 호스트가 사용할 OpenCL 디바이스 목록
- 커널
- OpenCL 디바이스에서 실행할 OpenCL 함수들
- 프로그램 오브젝트
- 프로그램 소스 및 실행 오브젝트
- 메모리 오브젝트
- 호스트와 OpenCL 디바이스에서 접근 가능한 메모리 오브젝트 집합
- 커널은 계산 과정에서 메모리 오브젝트 사용
- 디바이스
커맨트 큐(Command Queue)
호스트가 디바이스별로 생성
- 하나의 디바이스에서 여러 개의 커맨드 큐 연결 가능
호스트가 디바이스에서 실행될 커맨드를 enqueue
커맨드의 종류
- 커널 실행 커맨드
- 메모리 커맨드
- 데이터 이동, 호스트 메모리에 메모리 오브젝트의 map/unmap
- 동기화 커맨드
커맨드 실행 모드
- In-order Execution
- 삽입 순서대로
- 기본 실행 모드
- Out-of-order Execution
- 커맨드 큐 생성시 지정 가능
- In-order Execution
반응형
'멀티코어 프로그래밍 > OpenCL' 카테고리의 다른 글
OpenCL Architecture(5) (19) | 2022.04.14 |
---|---|
OpenCL Architecture(4) (42) | 2022.04.13 |
OpenCL Architecture(2) (22) | 2022.04.11 |
OpenCL Architecture(1) (11) | 2022.04.10 |
OpenCL 프로그래밍(3) (2) | 2015.08.06 |
댓글