TECH 으로 돌아가기
TECH HACKER NEWS 오늘 7분 읽기 26 READS

GPU '점유율(Occupancy)' 제대로 이해하기 — AMD MI355X로 풀어보는 첫 원리

GPU로 빠른 코드를 짜는 사람들 사이에서 늘 나오는 말이 있어요. "occupancy(점유율)를 높여라." 근데 이게 정확히 뭔지, 왜 높여야 하는지, 어떻게 계산하는지는 의외로 두루뭉술하게 아는 경우가 많거든요. 이번에 소개할 글은 AMD의 최신 데이터센터 GPU인 'MI355X'를 예로 들어서, 이 occupancy라는 걸 가장 밑바닥 원리부터 손으로 계산해보는 가이드예요. NVIDIA만 쓰던 분들에게도 개념 자체는 똑같이 통하니까 같이 보면 좋아요.

Occupancy가 도대체 뭐냐면

GPU는 CPU랑 일하는 방식이 완전히 달라요. CPU는 똑똑한 일꾼 몇 명이 일을 빠르게 처리하는 구조라면, GPU는 좀 덜 똑똑하지만 엄청나게 많은 일꾼이 동시에 같은 일을 처리하는 구조예요. 이 일꾼들을 GPU에선 작은 묶음으로 관리하는데, AMD에선 이 묶음을 'wavefront(웨이브프런트)'라고 불러요. NVIDIA의 'warp'와 같은 개념이고, 보통 32개나 64개의 스레드(가장 작은 작업 단위)가 한 묶음이에요.

GPU 안에는 'CU(Compute Unit, 연산 유닛)'라는 작업장이 잔뜩 있고, 각 작업장에는 동시에 올려둘 수 있는 wavefront의 최대 개수가 정해져 있어요. Occupancy란 바로 "이 작업장에 올릴 수 있는 최대 wavefront 대비, 실제로 올라가 있는 wavefront의 비율"이에요. 최대 40개 올릴 수 있는데 실제로 20개만 올라가 있으면 occupancy는 50%인 거죠.

왜 이걸 높이려고 할까

이유는 '기다리는 시간 숨기기'예요. GPU 작업이 메모리에서 데이터를 가져올 때는 꽤 오래 기다려야 하거든요. 만약 작업장에 wavefront가 하나뿐이면, 걔가 메모리 기다리는 동안 작업장 전체가 멍하니 놀게 돼요. 근데 wavefront가 여러 개 올라가 있으면, 하나가 데이터를 기다리는 사이 다른 wavefront로 휙 갈아타서 계속 일을 시킬 수 있어요. 즉 occupancy가 높으면 메모리 대기 시간을 다른 일로 메워서 GPU가 안 노는 거예요.

무엇이 occupancy를 깎아먹나

문제는 작업장 자원이 유한하다는 거예요. wavefront 하나를 올리려면 그만큼 자원을 떼어줘야 하는데, 대표적인 게 두 가지예요. 하나는 레지스터(AMD에선 VGPR, 벡터 레지스터)인데, 계산에 쓰는 임시 값을 담는 초고속 저장 공간이에요. 커널(GPU에서 도는 함수)이 복잡해서 레지스터를 많이 쓰면, 작업장 레지스터 총량은 정해져 있으니 동시에 올릴 수 있는 wavefront 수가 확 줄어요. 다른 하나는 LDS(Local Data Share)예요. NVIDIA의 shared memory에 해당하는, wavefront들이 함께 쓰는 빠른 메모리인데, 이것도 많이 쓰면 동시 wavefront 수가 줄죠.

그래서 occupancy 계산은 결국 내 커널이 wavefront 하나당 레지스터를 몇 개, LDS를 얼마나 쓰는가를 따져서, 작업장의 총 자원으로 나눠 그래서 몇 개나 동시에 올라가나를 구하는 일이에요. MI355X 같은 최신 칩은 CDNA 4 아키텍처에 HBM3E라는 초고속 메모리를 얹은 물건이라 자원 수치가 다르니, 정확한 계산엔 그 칩의 스펙(CU당 레지스터 수, 최대 wavefront 수 등)을 대입해야 해요. 원문 글에서 이걸 단계별로 짚어줍니다.

한 가지 함정: 높다고 무조건 좋은 게 아니에요

여기서 중요한 반전이 있어요. occupancy가 높으면 좋다고 했지만, 100%가 항상 최고는 아니에요. 유명한 연구(Vasily Volkov의 "낮은 occupancy에서 더 좋은 성능")가 보여줬듯이, 때로는 wavefront당 레지스터를 넉넉히 써서 occupancy를 좀 낮추더라도 작업 하나하나가 더 효율적으로 도는 게 전체적으로 빠를 수 있거든요. occupancy는 성능의 '지표 중 하나'지 '목표 그 자체'가 아니라는 걸 기억해야 해요.

한국 개발자에게

요즘 AI·머신러닝 붐으로 GPU 커널을 직접 만지는 분들이 많아졌잖아요. 대부분 NVIDIA CUDA에 익숙한데, AMD가 ROCm 생태계와 MI 시리즈로 데이터센터 시장을 빠르게 파고들고 있어서 AMD GPU를 다룰 일이 점점 늘고 있어요. 이때 AMD는 용어가 다를 뿐 원리는 같다는 걸 알면 학습 부담이 확 줄어요. wavefront는 warp, LDS는 shared memory, VGPR은 레지스터 식으로요. occupancy 계산을 손으로 한번 해보면, GPU 커널을 튜닝할 때 "왜 이렇게 느리지?"의 답을 자원 관점에서 찾는 눈이 생겨요.

마무리

핵심 한 줄: Occupancy는 GPU 작업장에 일꾼을 얼마나 빽빽이 채웠는지를 나타내는 비율이고, 메모리 대기를 숨기는 핵심 열쇠지만 그 자체가 목표는 아니다.

여러분은 GPU 커널을 최적화할 때 occupancy를 직접 계산해본 적 있으세요? CUDA에서 ROCm으로, 혹은 그 반대로 옮겨본 경험이 있다면 어떤 점이 제일 헷갈렸는지 나눠봐요.


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://indianspeedster.github.io/blog/occupancy-math-mi355x...
SHARE
처리 중...