2013-05-15 2 views
2

OpenCL에서 전역 스레드 ID를 어떻게 얻을 수 있습니까? 내가 1 차원, 수식 것을 알고 :OpenClass에서 전역 2 차 입출력 스레드를 얻으려면

int global_id = get_global_id(1) * get_global_size(0) + get_global_id(0); 

하지만 난 이런 식으로 할당하는 경우 :

size_t block_size[] = {2,2} 
size_t grid_size[] = {35,20} 

위 공식은 0에서 35 * 20 인덱스를주고, 실패합니다. 인덱스는 0에서 35 * 40 * 2 * 2 사이 여야합니다.

이 모든 것이 어떻게 작동하는지 이해할 수있는 직감을 줄 수있는 훌륭한 문서 또는 저술을 추천 할 수 있습니까? 감사합니다.

답변

6

2D NDRange를 실행하는 경우 get_global_id (0) 및 get_global_id (1)은 Gx 및 Gy 인덱스를 제공합니다. get_local_id (0/1)를 사용하여 독립적으로 로컬 ID를 가져올 수도 있습니다.

직접 계산할 필요가 없습니다.

2D 스레드 블록을 시작했지만 해당 스레드를 1 차원 버퍼의 위치에 매핑하고 싶습니까?

편집 : 귀하의 의견을 읽은 후, 나는 설명이 순서라고 생각했습니다.

오픈 CL (0) * get_global_size (1) (* 20 ~ 35 인), 당신은

(0 ,0) (0 ,1) ... (0,34) 
(1 ,0) (1 ,1) ... (1,34) 
. 
. 
. 
(19,0) (19,1) ... (19,34) 

지역 worksize 단순히 분열 전체의 방법입니다 스레드

을 가지게됩니다 get_global_size만큼의 커널을 시작합니다 스레드 수를 계산하고 사용 가능한 계산 단위에 분산시킵니다. 임의의 시점에 2 * 2 = 4 스레드 만 실행될 가능성이 큽니다.

설명서는 local_work_size가 null 일 수 있음을 나타내며,이 경우 구현은 총 작업량을 나눌 크기를 결정합니다.

로컬 작업 크기는 절대로 스레드 수를 늘리지 않습니다.

아마도이 이미지는 내가 할 수있는 것보다 더 잘 설명합니다.

OpenCL 2D NDRange

참고 커널 출시의 총 수는 여전히 get_global_size됩니다 (0) * get_global_size (1).

1D 지수가 0 .. (35 * 40 * 2 * 2 - 1)이되도록하려면 get_global_size (0) * get_global_size (1)이 35 * 40 * 2 * 2가되도록 커널을 실행하십시오. (아마도 70 x 80?)

희망이 도움이됩니다.

+1

정확히 무슨 뜻인지 궁금합니다. 각 스레드는 0에서 시작하여 총 스레드 수로 끝나는 1D 버퍼에서 하나의 색인으로 식별되어야합니다. 이 공식은 무엇입니까? – Ravul

+0

감사합니다. 멋진 답변입니다! 이전에 예상대로 작동하지 않았던 이유는 매우 분명합니다! – Ravul