GPU 프로그래밍
CUDA에서 커널 도중에 다른 모든 블록의 계산이 끝나기를 기다린 뒤 다음 단계로 진행하고 싶다. 일반적인 방법은?
- A__syncthreads()를 호출한다
- B커널을 그 지점에서 둘로 나누고, 첫 번째 커널이 끝난 뒤에 두 번째를 실행한다
- C루프에서 다른 블록이 쓴 플래그를 계속 기다린다
정답과 해설 보기
정답: B. 커널을 그 지점에서 둘로 나누고, 첫 번째 커널이 끝난 뒤에 두 번째를 실행한다
블록은 독립적으로 어떤 순서로 실행되어도 되는 규칙이므로, 모든 블록이 동시에 GPU에 올라가 있다고는 할 수 없습니다. 기다리는 상대 블록이 아직 시작되지 않았다면 플래그를 기다리는 루프는 영원히 끝나지 않습니다. 그래서 같은 스트림에서 실행한 커널은 이전 커널이 끝난 뒤에 시작된다는 성질을 이용해, 커널을 나누어 전체 동기화를 하는 것이 일반적입니다.