GPU 프로그래밍

GPU에서 다수 값의 총합을 구할 때, 트리 형태의 리덕션(이웃끼리 더해 절반으로 줄이는 것을 반복)을 사용하는 이유로 올바른 것은?

  1. A하나의 스레드가 순서대로 더하는 것보다 덧셈 횟수가 크게 줄기 때문
  2. B각 단계에서 많은 스레드가 동시에 덧셈을 할 수 있어, n개의 값을 log2 n 단계로 합산할 수 있기 때문
  3. C부동소수점 오차가 반드시 0이 되기 때문
정답과 해설 보기

정답: B. 각 단계에서 많은 스레드가 동시에 덧셈을 할 수 있어, n개의 값을 log2 n 단계로 합산할 수 있기 때문

하나의 스레드가 순서대로 더하면 n-1 단계가 걸리지만, 트리 형태로 하면 1단계에서 n/2개 스레드가 이웃끼리 더하고, 2단계에서 n/4개가…를 반복하여 log2 n 단계로 끝납니다. 덧셈의 총 횟수는 같지만 단계 수가 적으므로 병렬로 빠르게 계산할 수 있습니다. 블록 안에서는 공유 메모리로 단계를 진행하고, 블록별 결과를 마지막에 모아 합산합니다.

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

GPU 프로그래밍의 다른 문제

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

이 분야의 비교