OpenCL:WorkItem
Opencl execution model
Opencl-execution-model.JPG
- SIMT
- SIMT 는 SINGLE INSTRUCTION MULTIPLE THREAD의 약자이며 이는 어떻게 host에서 명령어가 실행되는지 보여줍니다. 이름에서 알 수 있듯이, 같은 코드가 다른 스레드(thread)에서 병렬적으로 실행 되고, 각각의 thread는 각기 다른 데이터를 가지고 코드를 실행합니다.
- Work-item
- work-items은 CUDA threads와 같은 의미인데, 가장 작은 단위의 실행 객체(entity)입니다. 매시간 커널이 실행(launched)되면, 많은 work-items(프로그래머에 의해 수가 정해집니다)이 실행(launched)되고, 각각은 같은 코드를 실행합니다. 각각의 work-items는 커널에서 접근가능한 ID를 가지고 이를 통해 work-item들이 어떤 데이터를 처리하는지 구별할 수 있습니다.
- Work-group
- work-groups는 work-item들끼리 서로 통신하고, 협력(coorperation)하기 위해 존재합니다. 그것들은 work-items들이 어떻게 구성되어 있는지 보여줍니다(N차원의 격자모양인데, 1,2,3 차원이 될 수 있습니다). Work-groups는 CUDA thread blocks와 같은 말입니다. work-items처럼 work-groups 또한 kernel에서 참조 할 수 있는 고유의 ID를 가집니다.
- ND-Range
- ND-Range는 다음 레벨의 구성단위입니다. work-groups들이 어떻게 구성되는지 정의합니다(똑같이, N차원의 격자모양의 work-groups로써, 1,2 또는 3차원을 가집니다);
Work-Item Built-In Functions
- get_work_dim(): Number of dimensions in use
- get_global_size(): Number of global work items
- get_global_id(): Global work item ID value
- get_local_size(): Number of local work items
- get_local_id(): Local work item ID
- get_num_groups(): Number of work groups
- get_group_id(): Work group ID
Kernels Indexing
CUDA | OpenCL |
gridDim | get_num_groups() |
blockDim | get_local_size() |
blockIdx | get_group_id() |
threadIdx | get_local_id() |
blockIdx * blockDim + threadIdx | get_global_id() |
gridDim * blockDim | get_global_size() |