1차 공개일 · 8월 18일1차 강의가 모두 공개됩니다
TECH 으로 돌아가기
TECH HACKER NEWS 오늘 6분 읽기 34 READS

픽셀 8개를 한 번에 — 1997년 펜티엄 MMX로 배우는 SIMD의 원리

픽셀 8개를 한 번에 — 1997년 펜티엄 MMX로 배우는 SIMD의 원리
SOURCE IMAGE · HACKER NEWS
픽셀 8개를 한 번에 — 1997년 펜티엄 MMX로 배우는 SIMD의 원리

요즘 CPU 최적화의 뿌리, 1997년에 있었어요

simdjson 같은 초고속 파서, 비디오 코덱, 머신러닝 추론 라이브러리의 성능 이야기를 듣다 보면 꼭 나오는 단어가 있어요. SIMD요. 이 SIMD가 PC에 대중적으로 들어온 출발점이 1997년 인텔 펜티엄 MMX였는데요, 그 시절 MMX 프로그래밍이 실제로 어떤 모습이었는지 차근차근 풀어낸 글이 올라왔어요. 옛날 이야기 같지만, 읽고 나면 요즘의 AVX나 ARM NEON이 왜 그렇게 생겼는지가 훨씬 잘 보이거든요.

SIMD가 뭐냐면

Single Instruction, Multiple Data의 약자예요. 명령어 하나로 여러 개의 데이터를 동시에 처리한다는 뜻이죠. 비유하자면, 계산 문제 8개를 한 문제씩 푸는 게 아니라 계산기 8개를 나란히 놓고 버튼을 한 번만 눌러서 동시에 푸는 거예요. 이미지 처리를 생각해보면 왜 필요한지 바로 감이 와요. 사진 밝기를 올리려면 수백만 개 픽셀 전부에 똑같은 덧셈을 해야 하잖아요. 픽셀마다 명령어를 하나씩 실행하는 대신, 픽셀 여러 개를 묶어서 한 번에 처리하면 그만큼 빨라지는 거죠.

MMX는 어떻게 생겼었냐면

MMX는 MM0부터 MM7까지 64비트 레지스터 8개를 추가했어요. 레지스터가 뭐냐면 CPU 안에 있는 초고속 임시 저장 공간이에요. 이 64비트 공간에 8비트 값 8개, 16비트 값 4개, 또는 32비트 값 2개를 나란히 담아서(이걸 packed라고 불러요) 한 번에 연산하는 방식이었죠. 예를 들어 paddusb라는 명령어 하나면 픽셀 값 8개에 동시에 덧셈이 돼요.

특히 실무적으로 고마웠던 게 새추레이션(saturation) 연산이에요. 보통 8비트 정수는 255에서 1을 더하면 0으로 흘러넘치거든요(오버플로). 이미지에서 이런 일이 생기면 밝아져야 할 픽셀이 갑자기 새까매져요. 새추레이션 연산은 255를 넘으면 그냥 255에 고정시켜줘서, 밝기 조절이나 알파 블렌딩 같은 픽셀 연산을 조건문 없이 안전하게 처리할 수 있었어요. 멀티미디어를 겨냥한 설계라는 게 이런 데서 드러나죠.

그런데 설계에 유명한 흑역사가 하나 있어요. MMX 레지스터가 사실 새 공간이 아니라 기존 부동소수점 연산 장치(FPU)의 레지스터를 빌려 쓴 거였거든요. 왜 그랬냐면, 완전히 새 레지스터를 추가하면 운영체제가 컨텍스트 스위칭(작업을 전환할 때 CPU 상태를 저장하고 복원하는 일) 코드를 고쳐야 하는데, 기존 레지스터를 재활용하면 OS 수정 없이 바로 쓸 수 있었기 때문이에요. 영리한 꼼수였지만 대가가 있었죠. MMX 연산과 부동소수점 연산을 섞어 쓰려면 그때마다 EMMS라는 명령으로 상태를 정리해줘야 했고, 이걸 빼먹으면 계산 결과가 조용히 이상해지는 골치 아픈 버그가 났어요.

한계도 뚜렷했어요. MMX는 정수 연산만 됐거든요. 당시 한창 뜨던 3D 게임에 필요한 건 부동소수점 연산인데 말이죠. 그래서 1998년 AMD가 3DNow!로 부동소수점 SIMD를 먼저 치고 나왔고, 인텔은 1999년 펜티엄 III의 SSE로 응수해요. 이후 SSE2, AVX, AVX-512로 레지스터 폭은 512비트까지 넓어졌고, ARM 진영은 NEON과 SVE로 같은 길을 걸었어요. 지금 여러분의 폰과 노트북에서 돌아가는 영상 재생, JSON 파싱, ML 추론 뒤에는 전부 이 계보의 명령어들이 있는 거예요.

한국 개발자에게는

지금 MMX를 쓸 일은 당연히 없지만, 배울 가치는 커요. 레지스터 8개에 packed 정수 연산이라는 단순한 구조라서, SIMD의 원리를 처음 익히기에는 오히려 최신 명령어 세트보다 좋은 교재거든요. 여기서 개념을 잡으면 AVX 인트린식이나 ARM NEON 문서가 훨씬 덜 무섭게 읽혀요. 요즘은 컴파일러의 자동 벡터화가 좋아져서 어셈블리를 직접 쓸 일은 드물지만, 내 루프가 왜 벡터화가 안 되는지 이해하려면 결국 이 밑바닥 구조를 알아야 하고요. 게임, 영상 처리, 데이터 파이프라인처럼 같은 연산을 대량으로 반복하는 코드를 다루는 분이라면 특히 그래요.

한 줄 정리: 오늘날 모든 CPU에 들어 있는 SIMD의 기본 문법과 설계 트레이드오프는 이미 1997년 MMX에 거의 다 들어 있었다는 거예요. 여러분은 실무에서 SIMD 최적화를 직접 해본 적 있으세요? 자동 벡터화에 맡기는 편인지, 인트린식까지 내려가 보는 편인지 궁금하네요.


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://pikuma.com/blog/programming-intel-pentium-mmx-simd
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기
처리 중...