GPU 프로그래밍

GPU에서 픽셀 값의 히스토그램을 만들 때, 모든 스레드가 글로벌 메모리의 256개 빈(bin)에 atomicAdd로 직접 더하면 느린 경우가 있다. 개선 방법으로 올바른 것은?

  1. AatomicAdd를 그만두고 일반 덧셈으로 글로벌 메모리에 쓴다
  2. B빈의 수를 1개로 합친다
  3. C블록별로 공유 메모리에서 부분 히스토그램을 만들고, 마지막에 글로벌 메모리의 빈에 한꺼번에 더한다
정답과 해설 보기

정답: C. 블록별로 공유 메모리에서 부분 히스토그램을 만들고, 마지막에 글로벌 메모리의 빈에 한꺼번에 더한다

다수의 스레드가 같은 빈에 동시에 atomicAdd를 하면 갱신이 하나씩 순차적으로 처리되고, 게다가 글로벌 메모리는 느리므로 대기가 길어집니다. 각 블록이 공유 메모리에 자기 몫의 히스토그램을 두고 거기서 집계한 뒤 마지막에 한 번만 글로벌에 더하면, 느린 메모리에서의 경합은 블록 수×빈 수 횟수로 줄어듭니다. 공유 메모리에서의 원자 연산은 훨씬 빠르게 수행할 수 있습니다.

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

GPU 프로그래밍의 다른 문제

  1. GPU에서 다수 값의 총합을 구할 때, 트리 형태의 리덕션(이웃끼리 더해 절반으로 줄이는 것을 반복)을 사용하는 이유로 올바른 것은?
  2. 1024개의 값을 트리 형태의 리덕션으로 합산할 때 필요한 단계 수는 몇 개인가?
  3. 단일 GPU를 사용하는 프로그램에서 CPU 측 메모리와 GPU 측 메모리에 대해 일반적으로 올바른 것은?
  4. 배열 요소를 한 번만 더하는 가벼운 처리를 위해 데이터를 GPU로 보내면 CPU에서 계산하는 것보다 느려지는 경우가 있다. 주된 이유는?
  5. CPU 메모리를 핀 고정(페이지 락)한 뒤 GPU로 전송하면 빨라지는 이유로 올바른 것은?

이 분야의 비교