GPU 프로그래밍

CUDA에서 __syncthreads()를 "if (threadIdx.x < 16)" 안에 써서 일부 스레드만 통과하도록 했다. 일어날 수 있는 일로 올바른 것은?

  1. A16개의 스레드만으로 동기화가 되어 올바르게 동작한다
  2. B다른 스레드가 영원히 도착하지 않으므로 블록이 멈추거나 결과가 불확정이 될 수 있다
  3. C__syncthreads()는 자동으로 무시되므로 아무 일도 일어나지 않는다
정답과 해설 보기

정답: B. 다른 스레드가 영원히 도착하지 않으므로 블록이 멈추거나 결과가 불확정이 될 수 있다

__syncthreads()는 블록의 모든 스레드의 도착을 기다리므로, 일부 스레드만 통과하는 분기 안에 쓰면 기다려도 오지 않는 스레드가 생깁니다. 사양상 동작이 정의되어 있지 않아, 실제로는 멈추거나 우연히 동작해도 결과가 이상해질 수 있습니다. 동기화는 분기 바깥, 모든 스레드가 반드시 지나가는 곳에 쓰는 것이 원칙입니다.

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

GPU 프로그래밍의 다른 문제

  1. CUDA 공유 메모리의 뱅크 충돌에 대한 설명으로 올바른 것은?
  2. 32×32 float 표를 공유 메모리에 두고 워프의 32개 스레드로 열 방향(세로)으로 읽으면 뱅크 충돌이 발생한다. 자주 사용되는 대책은?
  3. GPU에서 큰 행렬의 곱을 계산할 때, 행렬을 작은 타일로 나누어 공유 메모리에 읽어 들이는 이유로 올바른 것은?
  4. GPU 커널에서 스레드당 레지스터 사용량이 너무 많을 때 일어날 수 있는 일로 올바른 것은?
  5. GPU의 점유율(occupancy)에 대한 설명으로 올바른 것은?

이 분야의 비교