CPU와 GPU의 설계 철학 차이: Latency 최적화(CPU) vs Throughput 최적화(GPU)
현대 엔터프라이즈 백엔드 아키텍처에서 0.001초의 응답 지연도 허용하지 않기 위해서 CPU 코어당 클럭을 5GHz 이상으로 끌어올리고 거대한 캐시 메모리를 도배하는 방식과, 인공지능 학습을 위해 클럭을 1.5GHz에 불과하게 설정했지만, 코어를 수만개씩 때리는 GPU 아키텍처는 트랜지스터 레벨에서 왜 완전히 상반된 길을 걷게 되었을까?
컴퓨터 아키텍처 설계는 한정된 다이 (Die, 실리콘 칩 면적) 공간 위에 어떤 목적을 가진 트랜지스터를 얼마나 배치할 것인가에 대한 타협의 산물이다. CPU와 GPU는 완전히 극단에 서 있는 하드웨어 설계 페러다임을 대변한다.
- 지연 시간 최적화 (Latency Optimization): 하나의 작업 task 또는 하나의 스레드가 시작되어 완료될때까지 걸리는 절대적인 시간 자체를 최소화하는 설계 방식이고 직렬처리의 속도를 극한으로 끌어올리는것이 핵심이다.
- 처리량 최적화 (Throughput Optimization): 단일 작업의 완료 속도로는 다소 느리더라도, 단위 시간 (ex. 1초)당 처리할 수 있는 총 작업의 양을 극대화하는 설계 방식이다. 병렬 처리를 극단으로 밀어붙이는 아키텍처다.
- ALU (Arithmetic Logic Unit, 산술논리연산장치): 덧셈, 곱셈, 비트연산등 실제 수학적 계산을 수행하는 물리적 하드웨어 회로다. CPU는 초고성능 복합 ALU를 소수 배치하는 반면 GPU는 단순 기능의 ALU를 수천~수만개 배치한다.
- 제어 유닛 (Control Unit): 명령어 코드를 Fetch하고 Decode하며, 데이터의 흐름을 제어하고 분기를 예측하는 하드웨어 스케줄러 계층이다. CPU는 다이 면적의 상당 부분을 이 제어 유닛과 캐시 메모리에 할당한다.
문제 정의 #
소프트웨어 엔지니어가 작성한 코드가 하드웨어에서 실행될 때 CPU GPU는 각각 다른 종류의 물리적 한계와 병목 현상에 직면한다.
- 폰 노이만 병목가 메모리 월: ALU의 연산 속도는 나노초 단위로 발전한 반면, 메인 메모리 DRAM의 데이터 전송 속도는 그에 미치지 못해 발생하는 속도 차이 병목이다. CPU가 메모리로부터 데이터를 읽어오는 동안 약 200~300클럭 사이클을 소요하고 아무런 연산도 하지 못하고 멈춰 서는 하드웨어 정지 현상이 발생한다.
- 제어 흐름 분기(Branch)의 불확실성 병목: 복잡한 비즈니스 로직 코드는 수많은 조건문 if-else, switch-case를 포함한다. 조건문의 결과가 나오기 전까지는 다음 명령어를 가져올 수 없으므로 하드웨어 파이프라인이 텅 비어버리는 파이프라인 버블 병목이 발생해 단일 스레드 성능이 곤두박질 친다.
- 데이터 의존성(Data Dependency) 병목: 다음 연산의 입력값이 이전 연산의 최종 출력값일 경우, 이전 연산이 물리적인 실리콘 회로를 다 통과할때까지 다음 연산 스레드는 대기해야만 한다.
아키텍처 혁신 및 해결 방식 #
두 하드웨어는 위에서 정의한 물리적 병목(특히 메모리 대역폭 및 레이턴시의 한계)를 해결하기 위해 완전히 다른 하드웨어적 구조 혁신을 선택했다.
- CPU의 혁신 (거대한 제어 유닛과 캐시 도배): CPU는 메모리 월과 분기 병목을 예측과 은닉으로 해결한다. 다이 면적의 50% 이상을 L1, L2, L3 캐시 메모리로 채워 데이터가 메모리까지 가지 않고 캐시 라인에서 즉시 ALU로 공급되게 만든다. 또한, 하드웨어 레벨의 분기 예측기(Branch Predictor)와 조건문 결과가 나오기 전에 미리 계산을 쳐두는 추측 실행 Speculative Execution, 명령어 순서를 런타임에 바꾸는 비순차적 실행 Out of Order Execution OoO 엔진을 탑재하여 단일 스레드 멈춤 현상을 강제로 방어한다.
- GPU의 혁신 (대규모 컨텍스트 스위칭을 통한 지연 복리화): GPU는 예측을 완전히 포기했다. GPU에는 분기 예측기도 없고, 비순차적 실행 엔진도 없으며, 캐시 메모리는 데이터를 보존하는 목적이 아닌 자주 쓰이는 데이터 전송 대역폭을 보조하는 용도로만 아주 작게 설계되어있다. 대신 그 면적에 전부 ALU를 채워 넣었다. GPU는 메모리 지연 시간(Stall)을 수 많은 다른 스레드로 돌려막기 하여 해결하는데 1번 스레드 그룹이 메모리에서 데이터를 가져오느라 멈추면, 하드웨어 스케줄러가 0클럭 만에 2번 스레드 그룹으로 연산 제어권을 전환하여 ALU가 단 1초도 쉬지않고 풀가동 되게 만든다.
원리 #
애플리케이션 코드가 실행될 때 cpu, gpu 내부 회로 및 데이터패스에서 발생하는 저수준 메커니즘을 추적해보자
CPU 데이터 페이스 #
- Fetch/Decode: 하드웨어 프론트엔드가 I-Cache에서 명령어를 가져온다. 비순차적 실행 OoO 큐에 명령어가 쌓이며, 레지스터 리네이밍을 통해서 소프트웨어 스레드가 가상 레지스터가 물리 레지스터로 매핑된다.
- Execution ALU: 데이터 의존성이 해결된 명령어부터 순서와 상관없이 Reservation Station에서 ALU로 투입된다. 복잡한 연산 장치 Barrel Shifter, 다단계 정밀도 부동 소수점 유닛을 통과한다.
- Cache Hit/Miss Path: 데이터를 읽을 때 하드웨어 프리페처가 미리 L2/L3 캐시로 데이터를 당겨놓아 ALU 버스 바로 옆의 L1 캐시 레벨에서 전송이 완료되도록 유도한다. 만약 캐시 미스가 나면 파이프라인이 락에 걸리며 대기 상태로 들어간다.
GPU 데이터 패스 #
- Warp Issuing: GPU 내부 SM(Streaming Multiprocessor)에 위치한 워프 스캐줄러가 실행 대기 큐를 스캔한다. gpu에서 실행 최소 단위는 단일 스레드가 아니라 32개의 스레드의 묶음인 워프이다.
- SIMT Execution Path: 하나의 명령어가 디코드되면 SM 내부의 32개 ALU에 동시에 전달된다 32개의 ALU는 각자 자신이 가진 레지스터 파일에서 독립된 데이터를 꺼내 동일한 연산을 동시에 실행한다. 이것이 바로 SIMT(Single Instruction, Multiple Threads) 아키텍처의 물리 경로이다.
- Zero overhead context switch: 어떤 워프가 HBM 메모리 접근 명령 (Instruction Global Memory Load)를 만나 멈추는 순간 워프 스케줄러는 레지스터를 메모리에 백업하는 소프트웨어 오버헤드 없이 하드웨어 스위치 회로만 돌려 다음 실행 가능한 다른 워프의 명령어 포인터를 ALU 활성화 라인에 연결한다. GPU의 레지스터 파일은 수만명의 스레드 자리를 동시에 담을 수 있을 만큼 물리적으로 거대하게 분할되어 있기 때문에 레지스터 백업/복구 비용이 0이다.
성능 지표 및 수학적 모델링 #
두 설계 철학의 차리를 컴퓨터 아키텍처 이론의 수학적 모델로 정량화 해보자
컴퓨팅 밀도 비교 모델
다이 Die 전체 면적 에서 연산 장치가 차지하는 순수 비율을 모델링한다.
리틀의 법칙을 통한 Throughput 유도
시스템 내에서 상주하는 스레드수 L, 지연시간 W, 처리량 TH의 관계식 L = TH x W를 변형한다.
- CPU: 단일 스레드의 지연시간 W를 극도로 줄여 분기 예측 및 캐시같은걸로 ㅇㅇ TH를 유지한다 시스탬 내 동시 스레드 수는 매우 적다.
- GPU: 메모리 지연시간 W이 수백 사이클로 길지만, 동시 가동되는 스레드수를 수만개 단위로 확장하여 처리량 TH를 cpu의 수십배로 끌어올린다.
레이어 및 프로파일링 설정 #
스레드 다이버전스 패널티 Thread Divergence #
GPU코드로 작성된 커널 함수 내부에 복잡한 if-else 분기문이 존재하면, 하드웨어 레벨에서 SIMT 구조가 파괴된다.
32개의 스레드중 15개는 if를 타고 17개가 else를 탈때 gpu는 분기 예측기가 없어 if파트 타는동안 else 파트 스레드들은 ALU 공급 전원을 차단하고 대기시킨뒤 순차적으로 다음 파트를 실행한다. 이를 워프 다이버전스 Warp divergence라고 한다.
GPU 활용률 Utilization 은 90퍼로 찍히지만 실제 연산 속도는 cpu보다 느려지는 현상이 발생할 수 있다.
Nsight System 프로파일링 지표 해석 #
SM Eligible Warps per Cycle은 클럭당 실행 가능한 준비가 된 워프의 평균 개수로 이 지표가 1미만으로 떨어지면 메모리 지연 시간을 숨길 수 있는 예비 스레드가 고갈되었다는 뜻이며 gpu가 데이터 공급알 받지 못해 멍하니 서있는 Memory Bound 상태임을 의미한다.
테스크 할당 전략 Workload Placement #
- CPU 적합 워크로드: 복잡한 포인터 추적, 빈번한 조건문 분기, 트랜잭션 처리, 오프셋 계산 등 (ex. db, query parsing, rest api)
- GPU 적합 워크로드: 데이터 간의 간섭이 없고 완전히 독립한 동일 연산의 무한 반복 (이미지 픽셀, 행렬 연산, 딥러닝 가중치 내적 연산)