GPU 프로그래밍
CUDA에서 __syncthreads()를 "if (threadIdx.x < 16)" 안에 써서 일부 스레드만 통과하도록 했다. 일어날 수 있는 일로 올바른 것은?
- A16개의 스레드만으로 동기화가 되어 올바르게 동작한다
- B다른 스레드가 영원히 도착하지 않으므로 블록이 멈추거나 결과가 불확정이 될 수 있다
- C__syncthreads()는 자동으로 무시되므로 아무 일도 일어나지 않는다
정답과 해설 보기
정답: B. 다른 스레드가 영원히 도착하지 않으므로 블록이 멈추거나 결과가 불확정이 될 수 있다
__syncthreads()는 블록의 모든 스레드의 도착을 기다리므로, 일부 스레드만 통과하는 분기 안에 쓰면 기다려도 오지 않는 스레드가 생깁니다. 사양상 동작이 정의되어 있지 않아, 실제로는 멈추거나 우연히 동작해도 결과가 이상해질 수 있습니다. 동기화는 분기 바깥, 모든 스레드가 반드시 지나가는 곳에 쓰는 것이 원칙입니다.