GPU 프로그래밍

하나의 워프 안에서 조건 분기에 의해 스레드의 절반이 if 쪽, 나머지 절반이 else 쪽으로 갈라졌다(워프 다이버전스). 일반적으로 어떻게 실행되는가?

  1. A양쪽을 동시에 실행하므로 속도는 변하지 않는다
  2. Belse 쪽 스레드는 실행되지 않고 버려진다
  3. Cif 쪽과 else 쪽을 차례로 실행하고, 각각의 실행 중에는 해당하지 않는 스레드가 쉬므로 효율이 떨어진다
정답과 해설 보기

정답: C. if 쪽과 else 쪽을 차례로 실행하고, 각각의 실행 중에는 해당하지 않는 스레드가 쉬므로 효율이 떨어진다

워프의 32개 스레드는 같은 명령을 실행하므로 분기가 갈라지면, 먼저 if 쪽 명령을 if 쪽 스레드만 활성화하여 실행하고 다음으로 else 쪽을 나머지 스레드로 실행합니다. 결과는 올바르지만 각각의 실행 중에는 절반의 스레드가 아무것도 하지 않으므로 시간은 두 경로의 합이 됩니다. 워프 안에서 분기가 일치하도록 데이터나 스레드 배치를 궁리하면 효율이 높아집니다.

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

GPU 프로그래밍의 다른 문제

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

이 분야의 비교