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)
  1. A(1)이 분기가 일치하므로 효율이 좋다
  2. B(1)은 모든 워프 안에서 분기가 갈라지지만, (2)는 워프별로 일치하므로 (2)가 효율이 좋다
  3. C둘 다 효율은 완전히 같다
정답과 해설 보기

정답: B. (1)은 모든 워프 안에서 분기가 갈라지지만, (2)는 워프별로 일치하므로 (2)가 효율이 좋다

(1)에서는 짝수와 홀수 스레드로 갈라지므로 어느 워프 안에나 A 쪽과 B 쪽 스레드가 섞여 있어, 모든 워프가 A와 B를 차례로 실행합니다. (2)에서는 스레드 번호를 32로 나눈 값으로 나누므로 하나의 워프의 32개 스레드가 모두 같은 쪽이 되어, 워프마다 A 또는 B 중 한쪽만 실행합니다. 같은 작업이라도 조건을 워프 단위로 일치시키면 다이버전스가 사라집니다.

이 분야 연습하기 분야로 돌아가기

GPU 프로그래밍의 다른 문제

  1. GPU의 메모리 병합 접근(코얼레싱)에 대한 설명으로 올바른 것은?
  2. 각 스레드의 번호를 i로 하여, 위와 같이 32요소 간격으로 배열을 읽으면 a[i]를 읽는 경우보다 느려진다. 주된 이유는?
  3. 입자의 위치 x, y, z를 가진 데이터를 GPU에서 처리할 때, 메모리 병합 접근 측면에서 유리한 배치는?
  4. CUDA 공유 메모리(shared memory)의 특징으로 올바른 것은?
  5. CUDA의 __syncthreads()의 역할로 올바른 것은?

이 분야의 비교