TECH 으로 돌아가기
TECH HACKER NEWS 어제 6분 읽기 46 READS

CPU 코어 하나로 85 GFLOPS 뽑아내기 — 행렬 곱셈 최적화로 배우는 하드웨어의 밑바닥

CPU 코어 하나로 85 GFLOPS 뽑아내기 — 행렬 곱셈 최적화로 배우는 하드웨어의 밑바닥

삼중 for문에서 시작해 하드웨어 한계까지

한 개발자가 AMD Zen 3 CPU의 코어 단 하나로 FP32(32비트 부동소수점) 행렬 곱셈을 85.3 GFLOPS까지 끌어올린 과정을 GitHub에 공개했어요. GFLOPS가 뭐냐면, 1초에 부동소수점 연산을 몇십억 번 하는지를 나타내는 단위예요. 85.3 GFLOPS면 초당 853억 번의 실수 연산을 한다는 뜻이죠. GPU도 아니고, 멀티코어도 아니고, 코어 하나로요.

'행렬 곱셈이 뭐가 대단해?' 싶을 수 있는데요, 사실 행렬 곱셈은 현대 컴퓨팅의 심장이에요. 딥러닝 모델의 학습과 추론은 본질적으로 거대한 행렬 곱셈의 연속이고, 그래픽스, 물리 시뮬레이션, 과학 계산도 마찬가지거든요. 그래서 행렬 곱셈을 얼마나 빨리 하느냐는 수십 년째 성능 엔지니어링의 성배 같은 주제였어요.

순진한 코드는 왜 느릴까요

교과서에 나오는 행렬 곱셈은 삼중 for문이에요. C[i][j] += A[i][k] * B[k][j]를 돌리는 거죠. 이 코드를 그냥 컴파일해서 돌리면 잘해야 몇 GFLOPS 수준에서 멈춰요. 최적화 버전과 수십 배 차이가 나는 건데, 같은 CPU, 같은 수학인데 왜 이럴까요?

범인은 크게 둘이에요. 첫째, 메모리예요. CPU는 계산은 엄청 빠른데, 메인 메모리(RAM)에서 데이터를 가져오는 건 상대적으로 아주 느려요. 비유하자면 요리사(CPU)의 손은 번개처럼 빠른데 재료 창고(RAM)가 옆 건물에 있는 셈이죠. 그래서 CPU 안에는 캐시라는 작은 냉장고(L1, L2, L3)가 있는데, 순진한 삼중 for문은 이 캐시를 제대로 활용하지 못하고 창고를 계속 들락거려요. 둘째, CPU의 병렬 연산 능력을 안 쓰는 거예요. 요즘 CPU에는 SIMD라는 기능이 있어서 명령어 하나로 여러 개의 숫자를 동시에 연산할 수 있거든요. Zen 3의 AVX2는 256비트 레지스터로 FP32 8개를 한 번에 처리하고, 여기에 FMA(곱하기와 더하기를 한 명령으로 처리하는 기능)까지 쓰면 사이클당 처리량이 훌쩍 뛰어요.

85 GFLOPS를 만드는 기법들

이런 최적화의 정석 코스는 대략 이래요. 먼저 캐시 블로킹(타일링)이에요. 큰 행렬을 캐시에 쏙 들어가는 작은 블록으로 잘라서, 한 번 캐시에 올린 데이터를 최대한 재사용하는 거죠. 다음은 마이크로커널이에요. 가장 안쪽 루프를 레지스터에 올라간 아주 작은 블록만 다루도록 만들어서, CPU의 FMA 유닛이 한 사이클도 쉬지 않고 돌아가게 어셈블리 수준으로 튜닝하는 거예요. 여기에 데이터를 미리 연속된 메모리로 재배열하는 패킹, 다음에 쓸 데이터를 미리 캐시로 불러오는 프리페치, 루프 언롤링 같은 기법이 더해져요.

이게 얼마나 잘한 건지 감을 잡아볼까요. Zen 3 코어는 사이클당 256비트 FMA를 2개 실행할 수 있어서, 이론상 사이클당 FP32 연산 32번이 가능해요. 클럭이 4GHz대라고 하면 이론 최대치가 대략 130~150 GFLOPS 언저리인데, 85.3 GFLOPS면 이론 한계의 절반을 훌쩍 넘는 수준까지 짜낸 거예요. 참고로 이 정도 영역은 OpenBLAS, BLIS, 인텔 MKL 같은 수십 년 내공의 전문 라이브러리들이 노는 무대거든요. 개인 프로젝트로 여기까지 따라간 것 자체가 훌륭한 학습 기록인 거죠.

'어차피 라이브러리 쓸 건데'라고요?

맞아요, 실무에서는 NumPy 뒤의 BLAS, PyTorch 뒤의 커널 라이브러리를 그냥 쓰면 돼요. 직접 짤 일은 거의 없어요. 그런데 이런 과정을 한 번 따라가 본 경험은 다른 데서 빛을 발해요. '왜 이 코드는 캐시 미스 때문에 느리지?', '왜 데이터 레이아웃을 바꿨더니 두 배 빨라졌지?' 같은 실무의 성능 문제들이 전부 같은 원리 위에 있거든요. 특히 요즘처럼 LLM 추론 비용이 화두인 시대에는, 하드웨어 밑바닥을 이해하는 엔지니어의 가치가 계속 오르고 있고요. 공부해보고 싶다면 'How to optimize GEMM' 류의 튜토리얼이나 BLIS 프로젝트의 문서에서 시작하는 걸 추천해요. 작은 행렬 곱셈 하나를 단계별로 최적화해보는 것만큼 컴퓨터 구조가 손에 잡히는 공부가 없거든요.

정리하면, 행렬 곱셈 최적화는 SIMD, 캐시, 메모리 계층이라는 현대 CPU의 본질을 한 문제에 압축해놓은 최고의 교재예요. 여러분은 성능 최적화를 어디까지 파고들어 보셨나요? '검증된 라이브러리를 믿는다' 파와 '밑바닥까지 이해해야 직성이 풀린다' 파, 여러분은 어느 쪽이신가요?


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://github.com/houslast3/85.30-GFLOPS-Single-Core-FP32-M...
SHARE
처리 중...