개요
GPU(Graphic Processing Unit)는 병렬 연산에 최적화된 아키텍처로, 그래픽 렌더링뿐만 아니라 딥러닝, 과학 계산 등 다양한 분야에서도 중요한 역할을 하고 있다. 이 장에서는 GPU의 프로세서 코어 설계에 대해 다뤄본다.
SIMD(Single Instruction, Multiple Data) 설계
GPU 코어는 SIMD(단일 명령 다중 데이터) 구조를 따르는 경우가 많다. SIMD는 하나의 명령어가 여러 데이터에 동시에 적용될 수 있게 하여 병렬 연산을 효율적으로 수행할 수 있다.
워프(Warp)와 스레드(Thread) 개념:
- GPU는 워프라는 단위로 스레드들을 묶어 한 번에 처리한다. 일반적으로 하나의 워프는 32개의 스레드로 구성된다.
- 모든 스레드는 동일한 명령어를 실행하지만 서로 다른 데이터를 처리한다.
스레드 다이버전스(Thread Divergence) 관리
스레드 다이버전스는 같은 워프 내의 여러 스레드가 서로 다른 명령어 경로를 따를 때 발생한다. 이는 GPU의 병렬 처리 성능을 저하시킬 수 있다.
제어 흐름 다이버전스:
- if-else 조건문에서 다이버전스가 발생할 수 있다.
- 워프 내의 모든 스레드가 하나의 경로를 따라가도록 리컨버전스(divergence) 관리 기법이 필요하다.
코어의 메모리 계층 구조
GPU 코어는 다양한 메모리 계층 구조를 가지고 있다. 각각의 계층은 다른 속도와 용량을 제공하여 다양한 연산 요구 사항을 충족시킨다.
레지스터 파일:
- 각 스레드는 고속의 레지스터 파일을 가지고 있어, 데이터 접근 속도가 매우 빠르다.
공유 메모리:
- 같은 블록 내의 스레드들이 공유할 수 있는 메모리 공간으로, 저지연 메모리 접근을 가능하게 한다.
글로벌 메모리:
- GPU 전체에서 접근 가능한 메모리로, 많은 양의 데이터를 저장할 수 있지만, 접근 속도는 느리다.
명령어 발행 및 스케줄링
GPU는 여러 개의 명령어를 병렬로 발행하여 스레드의 실행 효율을 극대화한다. 이를 위해 다양한 스케줄링 기법이 사용된다.
워프 스케줄링:
- 워프는 발행 대기열에 대기하다가 필요한 리소스가 확보되면 발행된다.
- 이 과정에서 리소스 사용 효율을 높이기 위해 신중한 스케줄링이 필요하다.
연산 유닛
GPU 코어는 다양한 종류의 연산 유닛을 포함하고 있다. 각 유닛은 특정 종류의 연산을 전문적으로 처리한다.
ALU(Arithmetic Logic Unit):
- 기본 산술 연산을 처리하는 연산 유닛이다.
SFU(Special Function Unit):
- 복잡한 수학적 연산(예: 삼각 함수, 지수 함수 등)을 처리하는 유닛이다.
에너지 효율
GPU는 일반적으로 고성능을 목표로 하지만, 에너지 효율 또한 중요한 설계 목표 중 하나이다. 에너지 효율을 극대화하기 위한 다양한 기법들이 적용된다.
다이나믹 전압 및 주파수 스케일링(DVFS):
- 실행 중인 워크로드에 따라 전압과 주파수를 조절하여 에너지 소비를 줄인다.
파워 게이팅:
- 사용되지 않는 유닛을 비활성화하여 전력 소비를 줄이는 기법이다.
메모리 접근 최적화
GPU의 성능을 극대화하기 위해서는 메모리 접근의 효율성을 극대화해야 한다. 이를 위해 다양한 최적화 기법들이 적용된다.
메모리 공존성(코러스케일러티):
- 스레드들이 가능한 한 인접한 메모리 위치에 접근하도록 코드를 작성하는 것이 중요하다.
뱅크 충돌 방지(Bank Conflict Avoidance):
- 공유 메모리는 여러 개의 뱅크로 나눠져 있으며, 같은 뱅크에 동시에 접근하면 충돌이 발생할 수 있다. 이를 방지하기 위한 다양한 코딩 기법이 존재한다.
캐싱
GPU에는 다양한 캐싱 기법이 적용되어 메모리 접근 속도를 향상시키고, 데이터의 재사용성을 높인다.
L1 및 L2 캐시:
- 빠른 접근 시간을 제공하며, 자주 사용되는 데이터를 캐시에 저장하여 메모리 접근 시간을 줄인다.
텍스처 캐시:
- 그래픽 연산에서 자주 사용되는 텍스처 데이터의 빠른 접근을 돕는다.
프로그래밍 모델
GPU를 효과적으로 프로그래밍하기 위해서는 적절한 프로그래밍 모델을 이해하는 것이 중요하다.
CUDA:
- NVIDIA의 GPU를 프로그래밍하기 위한 프레임워크로, C언어를 기반으로 한다.
OpenCL:
- GPU뿐만 아니라 다양한 이종 시스템을 위한 프로그래밍 표준이다.
응용 분야
GPU는 그래픽 렌더링 외에도 다양한 분야에서 활용된다.
딥러닝:
- 대규모 신경망 연산에 적합하며, 고속의 병렬 처리가 가능하다.
과학 계산: - 복잡한 수학적 연산을 빠르게 처리할 수 있어, 기후 모델링, 천체 물리학 등에서 사용된다.