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 일 수 있음을 나타내며,이 경우 구현은 총 작업량을 나눌 크기를 결정합니다.
로컬 작업 크기는 절대로 스레드 수를 늘리지 않습니다.
아마도이 이미지는 내가 할 수있는 것보다 더 잘 설명합니다.
참고 커널 출시의 총 수는 여전히 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?)
희망이 도움이됩니다.
출처
2013-05-15 15:44:51
Ani
정확히 무슨 뜻인지 궁금합니다. 각 스레드는 0에서 시작하여 총 스레드 수로 끝나는 1D 버퍼에서 하나의 색인으로 식별되어야합니다. 이 공식은 무엇입니까? – Ravul
감사합니다. 멋진 답변입니다! 이전에 예상대로 작동하지 않았던 이유는 매우 분명합니다! – Ravul