GPU 프로그래밍

CUDA에서 커널 도중에 다른 모든 블록의 계산이 끝나기를 기다린 뒤 다음 단계로 진행하고 싶다. 일반적인 방법은?

  1. A__syncthreads()를 호출한다
  2. B커널을 그 지점에서 둘로 나누고, 첫 번째 커널이 끝난 뒤에 두 번째를 실행한다
  3. C루프에서 다른 블록이 쓴 플래그를 계속 기다린다
정답과 해설 보기

정답: B. 커널을 그 지점에서 둘로 나누고, 첫 번째 커널이 끝난 뒤에 두 번째를 실행한다

블록은 독립적으로 어떤 순서로 실행되어도 되는 규칙이므로, 모든 블록이 동시에 GPU에 올라가 있다고는 할 수 없습니다. 기다리는 상대 블록이 아직 시작되지 않았다면 플래그를 기다리는 루프는 영원히 끝나지 않습니다. 그래서 같은 스트림에서 실행한 커널은 이전 커널이 끝난 뒤에 시작된다는 성질을 이용해, 커널을 나누어 전체 동기화를 하는 것이 일반적입니다.

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

GPU 프로그래밍의 다른 문제

  1. GPU에서 픽셀 값의 히스토그램을 만들 때, 모든 스레드가 글로벌 메모리의 256개 빈(bin)에 atomicAdd로 직접 더하면 느린 경우가 있다. 개선 방법으로 올바른 것은?
  2. GPU에서 다수 값의 총합을 구할 때, 트리 형태의 리덕션(이웃끼리 더해 절반으로 줄이는 것을 반복)을 사용하는 이유로 올바른 것은?
  3. 1024개의 값을 트리 형태의 리덕션으로 합산할 때 필요한 단계 수는 몇 개인가?
  4. 단일 GPU를 사용하는 프로그램에서 CPU 측 메모리와 GPU 측 메모리에 대해 일반적으로 올바른 것은?
  5. 배열 요소를 한 번만 더하는 가벼운 처리를 위해 데이터를 GPU로 보내면 CPU에서 계산하는 것보다 느려지는 경우가 있다. 주된 이유는?

이 분야의 비교