"컴퓨터는 숫자를 어떻게 저장하고, 한 번에 얼마나 많이 계산할까?"
이 글에서는 CPU 내부의 표현 방식과, 현대 CPU의 핵심 기술인 SIMD 구조를 정리하겠다.
모든 데이터는 결국 0과 1로 표현된다.
| 단위 | 크기 | 예시 |
|---|---|---|
| 1 bit | 0 또는 1 | 1개의 전기 신호 |
| 8 bits | 1 byte | ‘A’ = 01000001 |
| 16 bits | 2 bytes | UTF-16 문자 등 |
| 32 bits | 4 bytes | 일반적인 정수형(int) |
| 64 bits | 8 bytes | CPU 레지스터 크기(현대 기준) |
CPU는 음수를 표현하기 위해 2의 보수 방식을 사용한다.
| 십진수 | 이진수 (8bit) | 비고 |
|---|---|---|
| +5 | 0000 0101 | 양수 그대로 저장 |
| -5 | 1111 1011 | 2의 보수 형태로 저장 |
2의 보수 만드는 법
- 양수의 비트를 모두 뒤집는다 (1의 보수)
- +1을 더한다 ->
0000 0101 -> 1111 1010 -> 1111 1011
이 방식 덕분에 CPU는
"덧셈 회로 하나로 뺄셈까지 계산할 수 있다."
실수는 IEEE 754 부동소수점 표준으로 표현된다.
[ 부호(S) | 지수(E) | 가수(M) ]
1bit 8bit 23bit
| 구분 | 비트 수 | 역할 |
|---|---|---|
| 부호(S) | 1 | 0 = +, 1 = - |
| 지수(E) | 8 | 소수점의 위치 (2의 지수 표현) |
| 가수(M) | 23 | 실제 숫자의 유효한 부분 (정밀도) |
예시)
10.5를 IEEE 754로 표현
1. 10.5 = 1010.1 (2진수)
2. 정규화 -> 1.0101 * 2^3 (컴퓨터는 2진수로 동작하기 때문에 2의 제곱을 기준으로 소수점이 움직인다.)
3. 지수 = 3 + 127 = 130 (10000010)
4. 부호 = 0, 가수 = 0101...
-> 따라서 저장 비트:0 10000010 01010000000000000000000
| 항목 | 의미 | 예시 |
|---|---|---|
| 부호 비트 | 양수/음수 결정 | 0 = +, 1 = - |
| 지수 | 소수점 위치 이동량 | +127을 더해서 저장 |
| 가수 | 실수의 유효자리 | 소수 이하를 2진수로 표현 |
Single Instruction, Multiple Data
"한 번의 명령으로 여러 데이터를 동시에 계산한다."
일반적인 CPU 명령어는 한 번에 하나의 데이터 쌍만 계산한다. 하지만 비슷한 계산을 반복적으로 수행해야 하는 작업에서는 이 방식이 너무 느리다.
그래서 CPU는 SIMD라는 구조를 도입했다.
"명령어는 한 번, 데이터는 여러 개"
예시)
| 방식 | 설명 | 예시 |
|---|---|---|
| 일반 연산 (Scalar) | 한 번에 하나씩 계산 | a1 + b1, a2 + b2, a3 + b3 |
| SIMD 연산 | 한 번에 여러 개를 동시에 계산 | [a1,a2,a3,a4] + [b1,b2,b3,b4] |
CPU는 SIMD를 위해 특수한 레지스터를 갖고 있다.
| 세대 | 명령어 집합 | 레지스터 크기 | 예시 |
|---|---|---|---|
| SSE (Streaming SIMD Extensions) | 128bit | xmm0 ~ xmm15 | |
| AVX (Advanced Vector Extensions) | 256bit | ymm0 ~ ymm15 | |
| AVX-512 | 512bit | zmm0 ~ zmm31 |
하나의 레지스터에 32bit 실수 4개를 담으면, addps 명령 한번으로 4개의 덧셈이 동시에 일어난다.
section .data
A dd 1.0, 2.0, 3.0, 4.0
B dd 5.0, 6.0, 7.0, 8.0
section .text
global _start
_start:
movaps xmm0, [A] ; xmm0 = {1.0, 2.0, 3.0, 4.0}
movaps xmm1, [B] ; xmm = {5.0, 6.0, 7.0, 8.0}
addps xmm0, xmm1 ; xmm0 = {6.0, 8.0, 10.0, 12.0}
mulps xmm0, xmm1 ; xmm0 = {30.0, 48.0, 70.0, 96.0}
mov eax, 60
xor edi, edi
syscall
해석
movaps: 128비트를 한 번에 복사addps: "Add Packed Single" - 실수 4개를 병렬로 더함mulps: "Multiply Packed Single" - 실수 4개를 병렬로 곱함
| 구분 | 일반 연산 | SIMD 연산 |
|---|---|---|
| 명령어 수 | 4회 반복 | 1회만 실행 |
| 레지스터 접근 | 매번 필요 | 한 번에 4개 |
| 처리 속도 | 느림 | 3~8배 빠름 |
SIMD는 CPU 성능을 폭발적으로 끌어올리는 핵심 기술이다.
SIMD 명령은 내부적으로 ALU가 여러 개 병렬로 연결되어 있다.
즉, 하나의 명령이 내려오면