GPU 프로그래밍
GPU에서 픽셀 값의 히스토그램을 만들 때, 모든 스레드가 글로벌 메모리의 256개 빈(bin)에 atomicAdd로 직접 더하면 느린 경우가 있다. 개선 방법으로 올바른 것은?
- AatomicAdd를 그만두고 일반 덧셈으로 글로벌 메모리에 쓴다
- B빈의 수를 1개로 합친다
- C블록별로 공유 메모리에서 부분 히스토그램을 만들고, 마지막에 글로벌 메모리의 빈에 한꺼번에 더한다
정답과 해설 보기
정답: C. 블록별로 공유 메모리에서 부분 히스토그램을 만들고, 마지막에 글로벌 메모리의 빈에 한꺼번에 더한다
다수의 스레드가 같은 빈에 동시에 atomicAdd를 하면 갱신이 하나씩 순차적으로 처리되고, 게다가 글로벌 메모리는 느리므로 대기가 길어집니다. 각 블록이 공유 메모리에 자기 몫의 히스토그램을 두고 거기서 집계한 뒤 마지막에 한 번만 글로벌에 더하면, 느린 메모리에서의 경합은 블록 수×빈 수 횟수로 줄어듭니다. 공유 메모리에서의 원자 연산은 훨씬 빠르게 수행할 수 있습니다.