Lecture 25. 컴퓨터 구조
개요
핵심 질문
- CPU·메모리·저장장치는 어떻게 협력하여 프로그램을 실행하는가?
- 캐시 메모리와 메모리 계층 구조는 성능에 어떤 영향을 미치는가?
- GPU는 왜 딥러닝 연산에 유리한가?
- AI 시스템 설계에서 컴퓨터 구조 지식이 왜 필요한가?
학습 목표
- CPU의 핵심 구성 요소(ALU, CU, 레지스터)와 명령어 실행 사이클을 설명할 수 있다.
- 메모리 계층 구조와 캐시 동작 원리를 이해한다.
- GPU 아키텍처가 행렬 연산에 유리한 이유를 설명할 수 있다.
- AI 시스템 관점에서 메모리 병목·배치 크기·Mixed Precision의 의미를 이해한다.
핵심 개념
1. 컴퓨터의 핵심 부품
CPU (Central Processing Unit)
- ALU (산술논리연산장치): 실질적인 연산 수행 — 사칙연산, 논리 연산, 비교 연산
- CU (제어장치): 명령어를 해석하고 제어 신호를 생성하여 각 부품 조율
- 레지스터: CPU 내부의 초고속 임시 저장장치
메모리 계층 구조
CPU와 가까울수록 빠르고 용량이 작으며 비싸다.
| 계층 | 속도 | 용량 | 비용 |
|---|---|---|---|
| 레지스터 | ~1 사이클 | 수십 바이트 | 최고 |
| L1 캐시 (SRAM) | ~4 사이클 | 32~64 KB | 매우 높음 |
| L2 캐시 (SRAM) | ~12 사이클 | 256 KB~1 MB | 높음 |
| L3 캐시 (SRAM) | ~40 사이클 | 8~64 MB | 중간 |
| RAM (DRAM) | ~200 사이클 | 8~128 GB | 낮음 |
| SSD/HDD | ~수만 사이클 | TB 단위 | 매우 낮음 |
버스 (Bus)
부품 간 데이터를 주고받는 통로. 시스템 버스는 CPU·메모리·입출력 장치를 연결한다.
AI 개발자 관점: 딥러닝 학습의 병목은 대부분 메모리 계층 간 데이터 이동에서 발생한다. 연산 자체()보다 메모리 대역폭(Memory Bandwidth)이 실제 속도를 제한하는 경우가 많다.
2. 데이터 표현
정수 표현
- 비트(bit): 0과 1을 나타내는 최소 정보 단위
- 바이트(byte): 8비트 = 256가지 표현 가능
- 워드(word): CPU가 한 번에 처리하는 데이터 크기 — 현대 CPU는 대부분 64비트
부동소수점 (IEEE 754)
| 형식 | 부호 | 지수 | 가수 | 바이어스 |
|---|---|---|---|---|
| FP32 (단정밀도) | 1 bit | 8 bit | 23 bit | 127 |
| FP64 (배정밀도) | 1 bit | 11 bit | 52 bit | 1023 |
| FP16 (반정밀도) | 1 bit | 5 bit | 10 bit | 15 |
| BF16 (Brain Float) | 1 bit | 8 bit | 7 bit | 127 |
AI 개발자 심화 — Mixed Precision Training
FP32로 전체 학습하면 메모리와 연산량이 크다. Mixed Precision은 FP16/BF16으로 순전파·역전파를 수행하고 파라미터 업데이트는 FP32로 유지하는 방식이다.
- FP16: 범위가 좁아 수치 불안정(overflow/underflow) 위험 → Loss Scaling 필요
- BF16: FP32와 지수 비트 수가 같아 범위가 동일 → 학습 안정성 높음, 최근 선호
- 효과: 메모리 사용량 약 절반, 연산 속도 약 2~3배 향상
엔디안 (Endianness)
다중 바이트 데이터를 메모리에 저장하는 순서.
- 빅 엔디안: MSB(최상위 바이트)를 낮은 주소에 — 네트워크 표준
- 리틀 엔디안: LSB(최하위 바이트)를 낮은 주소에 — x86/x64 CPU 표준
3. CPU 구조와 명령어 실행
주요 레지스터
| 레지스터 | 역할 |
|---|---|
| 프로그램 카운터 (PC) | 다음 실행할 명령어의 메모리 주소 저장 |
| 명령어 레지스터 (IR) | 현재 실행 중인 명령어 저장 |
| 범용 레지스터 | 데이터·명령어·주소 임시 저장 |
| 스택 포인터 (SP) | 메모리 스택 영역의 최상단 주소 |
| 플래그 레지스터 | 연산 결과 상태 (부호, 제로, 오버플로우, 캐리 등) |
명령어 사이클
각 단계가 독립적이므로 파이프라이닝으로 병렬 처리 가능.
명령어 파이프라이닝
여러 명령어를 단계별로 겹쳐 실행하여 처리량(Throughput) 향상.
명령어1: [Fetch][Decode][Execute][Write]
명령어2: [Fetch][Decode ][Execute][Write]
명령어3: [Fetch ][Decode ][Execute][Write]파이프라인 위험(Hazard):
- 데이터 위험: 이전 명령어 결과를 다음 명령어가 사용 — 데이터 전달(Forwarding)로 완화
- 제어 위험: 분기(branch) 명령어로 PC가 갑자기 변경 — 분기 예측(Branch Prediction)으로 완화
- 구조적 위험: 여러 명령어가 동일 하드웨어 자원 동시 사용
CISC vs RISC
| CISC | RISC | |
|---|---|---|
| 명령어 수 | 많음, 복잡 | 적음, 단순 |
| 명령어 크기 | 가변 | 고정 |
| 클럭당 사이클 | 여러 사이클 | 1클럭 내외 |
| 파이프라이닝 | 비효율 | 최적화 |
| 대표 | x86, x86-64 (Intel, AMD) | ARM (Apple M1/M2, 모바일) |
인터럽트 (Interrupt)
CPU 작업을 중단시키는 신호.
- 하드웨어 인터럽트: 입출력 장치 완료 신호 — 비동기, CPU 폴링 불필요
- 소프트웨어 인터럽트(예외): 잘못된 연산, 시스템 콜 발생 시
인터럽트 처리 순서: 요청 신호 → 플래그 확인 → 현재 작업 백업 → ISR 실행 → 복구
AI 개발자 관점: CUDA 커널 실행, DMA 데이터 전송, GPU↔CPU 비동기 통신 모두 인터럽트 메커니즘 위에서 동작한다.
4. 메모리 (RAM)
RAM 종류
| 종류 | 특징 | 사용처 |
|---|---|---|
| DRAM | 느리지만 집적도 높음, 저렴 | 메인 메모리 |
| SRAM | 빠르지만 집적도 낮음, 고가 | 캐시 메모리 |
| SDRAM | 클럭 동기화 DRAM | DDR 계열 기반 |
| DDR4/DDR5 | 대역폭 향상 | 현대 메인 메모리 표준 |
| GDDR6/HBM2 | GPU 전용 고대역폭 | VRAM |
캐시 메모리
CPU 연산 속도(GHz)와 메모리 접근 속도(수백 사이클) 간격을 줄이기 위한 SRAM 기반 저장장치.
- L1 캐시: 코어 내부, 가장 빠름 (명령어 캐시 L1I + 데이터 캐시 L1D로 분리)
- L2 캐시: 코어 내부, L1 미스 시 참조
- L3 캐시: 코어 외부 공유, L2 미스 시 참조
캐시 히트와 미스
현대 프로세서의 캐시 적중률은 보통 95% 이상이다.
참조 지역성 (Locality of Reference)
- 시간 지역성: 최근 접근한 데이터를 다시 접근하는 경향 — 반복문 변수
- 공간 지역성: 접근한 주소 근처를 접근하는 경향 — 배열 순회
캐시 쓰기 정책
| 정책 | 방법 | 특징 |
|---|---|---|
| 즉시 쓰기 (Write-through) | 캐시·메모리 동시 쓰기 | 일관성 보장, 대역폭 소모 |
| 지연 쓰기 (Write-back) | 캐시에만 쓰고 나중에 메모리 반영 | 빠름, 일관성 위험 |
AI 개발자 심화 — 캐시와 딥러닝 성능
- 행렬 연산 메모리 접근 패턴: 행렬 곱 에서 를 열 방향으로 접근하면 캐시 미스가 많이 발생한다. 블록 행렬 분해(Tiling)로 캐시 효율을 높인다.
- FlashAttention: Attention 계산 시 크기의 어텐션 행렬을 메모리에 쓰는 대신, SRAM(온칩 캐시) 안에서 블록 단위로 계산 완료 후 버린다 → HBM(VRAM) 접근 횟수 대폭 감소.
- KV Cache: LLM 추론 시 이전 토큰의 K·V를 VRAM에 캐싱하여 재계산 방지. 시퀀스가 길어질수록 VRAM 사용량이 선형 증가하는 병목.
5. GPU 아키텍처
CPU vs GPU 설계 철학
| CPU | GPU | |
|---|---|---|
| 코어 수 | 수~수십 개 | 수천~수만 개 |
| 코어 성능 | 고성능, 범용 | 단순, 특화 |
| 캐시 | 대용량 (수십 MB) | 소용량 |
| 설계 목표 | 순차 처리 최적화 | 병렬 처리 최적화 |
| 적합한 작업 | 복잡한 제어 흐름 | 단순 반복 대량 연산 |
GPU가 행렬 연산에 유리한 이유
행렬 곱 의 각 원소 계산은 서로 독립적이다. GPU의 수천 개 CUDA 코어가 이를 동시에 병렬 계산한다.
SIMT (Single Instruction, Multiple Threads)
GPU는 SIMT 방식으로 동작한다 — 하나의 명령어가 수천 개의 스레드에서 동시에 실행된다.
CUDA 스레드 계층
Grid (전체 작업)
└─ Block (협력 스레드 묶음, 공유 메모리 공유)
└─ Thread (개별 실행 단위)CUDA 메모리 계층
| 메모리 | 위치 | 속도 | 크기 | 범위 |
|---|---|---|---|---|
| 레지스터 | 온칩 | 최고 | 수십 KB | 스레드 전용 |
| 공유 메모리 (SRAM) | 온칩 | 매우 빠름 | ~48 KB/Block | 블록 공유 |
| L1/L2 캐시 | 온칩 | 빠름 | MB 단위 | 자동 관리 |
| 글로벌 메모리 (HBM/GDDR) | 오프칩 | 느림 | GB 단위 | 전체 Grid |
HBM (High Bandwidth Memory)
기존 GDDR보다 대역폭이 5~10배 높은 GPU 전용 메모리. A100의 HBM2e는 2 TB/s, H100의 HBM3는 3.35 TB/s 대역폭.
산술 집약도가 낮은 연산은 메모리 대역폭 병목(Memory-Bound), 높은 연산은 연산 능력 병목(Compute-Bound).
AI 개발자 심화
- VRAM OOM (Out of Memory): 배치 크기·시퀀스 길이·모델 파라미터·옵티마이저 상태·활성화 값이 모두 VRAM을 사용한다. FP32 파라미터 1개 = 4 bytes, Mixed Precision 학습 시 추가 오버헤드(그래디언트, 옵티마이저 상태) 포함하면 파라미터당 약 16~20 bytes.
- 그래디언트 체크포인팅 (Gradient Checkpointing): 순전파 시 중간 활성화를 저장하지 않고 역전파 시 재계산 — 메모리 으로 감소, 연산량 약 33% 증가.
- 텐서 병렬(Tensor Parallelism): 하나의 행렬 곱을 여러 GPU에 분할하여 각 GPU가 일부분을 계산 후 합산. Megatron-LM 스타일.
- 파이프라인 병렬(Pipeline Parallelism): 모델의 층을 여러 GPU에 분할하여 마이크로배치 단위로 파이프라인 처리.
- TPU (Tensor Processing Unit): Google이 설계한 AI 전용 ASIC. 행렬 곱에 특화된 시스토릭 배열(Systolic Array) 구조. 범용성은 낮지만 특정 워크로드에서 GPU 대비 비용 효율적.
6. 보조기억장치와 입출력
RAID (Redundant Array of Independent Disks)
여러 디스크를 하나처럼 사용하여 성능 또는 안정성 향상.
| 레벨 | 방식 | 성능 | 안정성 | 사용 용량 |
|---|---|---|---|---|
| RAID 0 | 스트라이핑 | 최고 | 낮음 | 100% |
| RAID 1 | 미러링 | 읽기 향상 | 높음 | 50% |
| RAID 5 | 분산 패리티 | 중간 | 중간 | |
| RAID 6 | 이중 패리티 | 중간 | 매우 높음 | |
| RAID 10 | RAID 1+0 | 높음 | 높음 | 50% |
DMA (Direct Memory Access)
입출력 데이터를 CPU가 직접 처리하지 않고 DMA 컨트롤러가 메모리에 직접 전송한다 → CPU 오버헤드 감소.
PCIe (Peripheral Component Interconnect Express)
GPU·NVMe SSD를 CPU에 연결하는 고속 입출력 버스.
- PCIe 4.0 x16: ~32 GB/s 양방향 대역폭
- PCIe 5.0 x16: ~64 GB/s 양방향 대역폭
AI 개발자 심화
- GPU↔CPU 데이터 전송: PCIe를 통한
CPU→GPU(H2D),GPU→CPU(D2H)복사는 HBM 접근보다 훨씬 느리다. 데이터 전처리를 CPU에서 완료한 후 한 번에 전송하거나,pin_memory=True로 고정 메모리 사용 시 전송 속도 향상. - NVLink: NVIDIA GPU 간 직접 고속 통신 — A100 기준 최대 600 GB/s. PCIe보다 훨씬 빠른 GPU 간 통신 경로.
- 스토리지 병목: 대규모 데이터셋 학습 시 SSD 읽기 속도가 GPU 연산보다 느려 데이터 로딩이 병목이 될 수 있다. 분산 파일 시스템(HDFS, S3) + 멀티프로세스 DataLoader로 완화.
7. 멀티코어와 병렬 처리
하드웨어 스레드 vs 소프트웨어 스레드
- 하드웨어 스레드: 물리적으로 동시 실행되는 명령어 흐름 — 코어 수 × 하이퍼스레딩
- 소프트웨어 스레드: OS가 스케줄링하는 실행 단위 — 실제로는 시분할
병렬성 vs 동시성
- 병렬성: 물리적으로 동시에 실행 — 멀티코어, GPU CUDA 코어
- 동시성: 동시에 실행되는 것처럼 보이는 성질 — 단일 코어의 시분할
Amdahl의 법칙
병렬화로 얻을 수 있는 최대 속도 향상의 이론적 한계:
- : 병렬화 가능 비율, : 프로세서 수
- , 이면 최대 속도 향상은 약 17배
AI 개발자 심화
- 데이터 병렬(Data Parallelism): 같은 모델을 여러 GPU에 복제하고 미니배치를 분할하여 각 GPU가 독립적으로 순전파·역전파 수행 → 그래디언트를 AllReduce로 합산. PyTorch
DistributedDataParallel. - ZeRO (Zero Redundancy Optimizer): 옵티마이저 상태·그래디언트·파라미터를 GPU 간에 분할 저장하여 메모리 효율 극대화. DeepSpeed ZeRO Stage 1/2/3.
- Ring-AllReduce: 모든 GPU가 환형으로 연결되어 그래디언트를 분산 집계하는 알고리즘. 통신량 으로 GPU 수에 무관하게 효율적.
수식 정리
IEEE 754 부동소수점
캐시 적중률
산술 집약도
행렬 곱 (): FLOPs , 메모리 접근
이 클수록 Compute-Bound. 작은 배치에서는 Memory-Bound.
Amdahl의 법칙
VRAM 사용량 추정 (학습 시)
- : 파라미터 수, FP16 파라미터(2) + FP16 그래디언트(2) + FP32 파라미터(4) + FP32 1차 모멘텀(4) + FP32 2차 모멘텀(4)
- 실제로는 활성화 값·배치 크기·시퀀스 길이에 따른 추가 사용량 포함