본문으로 건너뛰기
HMYHardware Wiki

HMY-Wiki

하드웨어 / GPU·가속기

GPU 병렬 실행 구조

GPU는 같은 연산을 많은 데이터에 한꺼번에 적용할 때 힘을 내는 프로세서다. 연산 하나를 빨리 끝내는 대신, 여러 작업을 동시에 굴려 전체 처리량을 높이는 쪽으로 설계됐다. 스레드를 Wavefront나 Warp라는 실행 묶음으로 조직해 같은 명령을 함께 처리한다. 이 묶음은 소프트웨어 스레드의 실행 단위이며 물리 코어 개수와 같은 뜻은 아니다. 이 묶음 안에서 스레드가 서로 다른 분기로 갈라지면 양쪽 경로를 차례로 실행해야 해서 효율이 떨어진다. 분기가 적고 규칙적인 코드가 GPU에 잘 맞는 이유다.

실행 모델

실행 단위
Wavefront 또는 Warp로 묶어 같은 명령을 처리
분기
묶음 안 분기가 갈리면 경로를 나눠 실행해 효율이 떨어진다
구성
셰이더 코어, 텍스처 유닛, 래스터라이저·ROP, 고정 기능 블록
지연 감춤
메모리를 기다리는 동안 다른 묶음을 실행한다

명령 처리와 병렬 연산, 메모리 계층을 단순화한 GPU 개념 구조.

구성 요소마다 맡는 일이 다르다. 셰이더 코어는 산술과 논리 연산을 처리하고, 텍스처 유닛과 래스터라이저·ROP는 그래픽 파이프라인의 특정 단계를 전담한다. 레이 트레이싱과 행렬 연산처럼 되풀이되는 계산은 전용 고정 기능 블록이 맡는다. 그래서 코어 개수만으로 서로 다른 세대나 제품을 비교하기 어렵다. 제조사마다 블록 이름이 다르고, 한 블록이 한 번에 처리하는 작업량도 다르기 때문이다.

수천 개의 스레드가 동시에 도는 구조는 메모리를 기다리는 시간을 감추는 데 쓰인다. 어떤 묶음이 메모리 응답을 기다리는 동안 다른 묶음이 실행되면 연산 자원을 놀리지 않을 수 있다. 다만 이 방식이 효과를 보려면 프로그램 쪽에서 병렬 작업을 충분히 만들고, 메모리 접근을 연속된 주소로 배치해야 한다.

CPU와 GPU의 역할이 절대적으로 갈리는 것은 아니다. CPU는 분기가 많고 순서가 얽힌 작업에서 응답이 빠르고, GPU는 규칙적으로 반복되는 대량 연산에 강하다. 실제 프로그램은 보통 CPU가 데이터를 준비하고 명령을 던지면 GPU가 큰 연산을 맡는 식으로 나뉜다.

병렬도가 높아도 실행 자원이 비는 이유

NVIDIA CUDA에서 하나의 SM(Streaming Multiprocessor)에 동시에 상주하는 스레드 블록과 Warp 수는 레지스터·공유 메모리 사용량 및 하드웨어 한도의 영향을 받는다. 스레드마다 임시 값을 너무 많이 보관하면 동시에 상주하는 Warp 수가 줄어, 메모리 응답을 기다리는 동안 바꿔 실행할 작업이 부족해질 수 있다. Occupancy는 SM에 상주하는 활성 Warp 수를 해당 SM이 지원하는 최대 활성 Warp 수로 나눈 비율이다. 값이 높다고 성능이 항상 좋아지는 것은 아니다.

메모리 접근의 결합(Coalescing)도 중요하다. 인접 스레드가 가까운 주소를 요청하면 적은 메모리 전송으로 묶기 쉽지만, 멀리 흩어진 주소를 요청하면 더 많은 거래가 필요하다. 연산량이 같아도 데이터 배치만 바꿔 처리량이 달라질 수 있는 이유다.

관련: VRAM과 GPU 메모리 계층, NPU와 AI 가속기

참고 링크