GPU 프로그래밍
위의 (1)과 (2)는 모두 스레드의 절반에 A, 나머지에 B를 실행시킨다. 워프 효율 측면에서 올바른 설명은? (1워프=32스레드로 한다)
if (threadIdx.x % 2 == 0) A(); else B(); // (1)
if ((threadIdx.x / 32) % 2 == 0) A(); else B(); // (2)
- A(1)이 분기가 일치하므로 효율이 좋다
- B(1)은 모든 워프 안에서 분기가 갈라지지만, (2)는 워프별로 일치하므로 (2)가 효율이 좋다
- C둘 다 효율은 완전히 같다
정답과 해설 보기
정답: B. (1)은 모든 워프 안에서 분기가 갈라지지만, (2)는 워프별로 일치하므로 (2)가 효율이 좋다
(1)에서는 짝수와 홀수 스레드로 갈라지므로 어느 워프 안에나 A 쪽과 B 쪽 스레드가 섞여 있어, 모든 워프가 A와 B를 차례로 실행합니다. (2)에서는 스레드 번호를 32로 나눈 값으로 나누므로 하나의 워프의 32개 스레드가 모두 같은 쪽이 되어, 워프마다 A 또는 B 중 한쪽만 실행합니다. 같은 작업이라도 조건을 워프 단위로 일치시키면 다이버전스가 사라집니다.