이 글이 왜 필요한가

GPU 시스템을 공부하고 싶다고 하면 많은 사람이 바로 CUDA 문법이나 Triton 예제부터 찾는다. 물론 그 자체도 중요하다. 하지만 준비가 안 된 상태에서 바로 커널 코드로 들어가면, 문법은 따라가도 왜 그 코드가 빠른지 혹은 왜 느린지는 잘 안 남는다.

이 시리즈는 단순한 사용법보다 GPU가 실제로 어떻게 계산하고, 병목이 어디에서 생기며, 커널을 어떤 감각으로 봐야 하는지를 다룬다. 그래서 시작 전에 어떤 배경지식이 필요한지 정리해두는 편이 훨씬 낫다.

꼭 필요한 최소 배경지식

1. Python과 PyTorch 기본 사용 경험

GPU 시스템을 공부한다고 해서 Python만 알아서는 안 된다는 뜻은 아니다. 오히려 처음에는 Python과 PyTorch 경험이 있는 편이 훨씬 유리하다. 이유는 간단하다. 실제로 GPU 최적화가 필요한 순간은 대개 모델 학습이나 추론 코드에서 병목을 만날 때이기 때문이다.

즉, 아래 정도는 익숙한 편이 좋다.

  • tensor를 만들고 shape를 읽을 수 있다
  • 간단한 모델 학습 루프를 이해한다
  • matmul, softmax, layernorm 같은 연산 이름이 낯설지 않다

PyTorch를 전혀 모르는 상태에서도 GPU 자체를 공부할 수는 있다. 하지만 실제로 왜 이 커널이 중요한지와 어떤 연산을 최적화하려는지 감이 덜 잡힌다.

2. 기본적인 선형대수

GPU 시스템에서 가장 자주 다시 보게 되는 연산은 결국 벡터와 행렬이다. 특히 matrix multiply에 대한 감각은 거의 필수에 가깝다.

최소한 아래 정도는 익숙해야 한다.

  • 벡터와 행렬이 무엇인지
  • matrix multiply가 어떤 계산인지
  • shape가 어떻게 맞아야 연산이 되는지

여기서 중요한 것은 수학을 깊게 푸는 능력보다, 연산 구조를 머릿속에 그릴 수 있는지다. matmul이 어떤 차원을 따라 반복되는 계산인지 감이 있어야 thread mapping, tiling, tensor core 같은 이야기가 덜 추상적으로 들린다.

3. 기본적인 시스템 성능 감각

GPU 시스템은 결국 성능 이야기다. 그래서 아래 개념은 최소한 익숙한 편이 좋다.

  • latency와 throughput의 차이
  • 병렬성이라는 개념
  • memory hierarchy가 왜 중요한지
  • 계산보다 데이터 이동이 더 큰 병목이 될 수 있다는 사실

이 개념을 미리 다 완벽히 알아야 한다는 뜻은 아니다. 다만 이런 단어를 처음 보는 상태라면 시리즈를 따라갈 때 꽤 버거울 수 있다.

예를 들어 occupancy나 bandwidth를 볼 때도, 그 숫자 자체보다 "왜 이 값이 전체 처리량과 연결되는가"를 이해하려면 기본적인 시스템 감각이 필요하다.

4. C/C++ 스타일 코드 읽기 능력

처음부터 고급 C++을 잘할 필요는 없다. 하지만 최소한 아래 정도는 읽을 수 있으면 훨씬 편하다.

  • for loop
  • 배열 인덱싱
  • pointer 비슷한 접근 방식
  • 함수 호출과 조건문

CUDA 예제나 low-level extension 코드를 볼 때 결국 C/C++ 스타일 문법을 자주 만나게 된다. 쓰는 능력보다 읽는 능력이 먼저 중요하다.

있으면 좋은 배경지식

1. 컴퓨터 구조 기초

cache, register, memory hierarchy, SIMD 같은 개념을 어느 정도 알고 있으면 훨씬 빨리 연결된다. GPU는 CPU와 다르지만, 하드웨어 자원과 성능 제약을 생각하는 기본 태도는 비슷한 부분이 있다.

2. 기본적인 딥러닝 학습 경험

forward, backward, optimizer step, mixed precision, activation 같은 개념을 알고 있으면 softmax나 layernorm, attention kernel이 왜 중요한지 더 잘 보인다.

3. 프로파일링에 대한 태도

아직 Nsight를 몰라도 괜찮다. 다만 "코드가 돌아간다"와 "코드가 왜 느린지 안다"는 완전히 다른 문제라는 감각이 있으면 훨씬 좋다.

꼭 필요하지는 않은 것

다음은 있으면 좋을 수 있지만, 시작 단계에서는 필수는 아니다.

  • 고급 컴파일러 이론
  • 운영체제 내부 구조 지식
  • 분산 시스템 깊은 이해
  • Triton 경험
  • 실제 CUDA 프로젝트 경험

이런 것들이 없다고 GPU 시스템을 못 시작하는 것은 아니다. 오히려 시리즈를 따라가면서 점점 연결될 가능성이 더 크다.

어떤 사람이 바로 시작해도 괜찮은가

아래에 가깝다면 바로 시작해도 된다.

  • Python과 PyTorch는 어느 정도 써봤다
  • matrix multiply와 tensor shape가 낯설지 않다
  • 성능 병목과 메모리 이야기가 완전히 처음은 아니다
  • C 스타일 코드를 읽는 데 큰 거부감이 없다

반대로 아래에 가깝다면 먼저 조금 준비하는 편이 좋다.

  • tensor shape가 아직 자주 헷갈린다
  • matmul과 softmax가 무엇을 하는지 감이 약하다
  • 메모리 hierarchy나 throughput 같은 단어가 너무 낯설다
  • 인덱싱이 많은 코드만 보면 바로 막힌다

시작 전에 추천하는 빠른 준비

정말 빠르게 준비한다면 아래 정도면 충분하다.

  1. PyTorch tensor shape와 matmul 복습
  2. softmax, layernorm, attention이 대략 무엇인지 확인
  3. memory hierarchy, latency vs throughput 개념 복습
  4. 간단한 C 스타일 loop/indexing 코드 읽기

이 정도만 해도 시리즈를 따라갈 때 체감 난도가 꽤 내려간다.

이 시리즈를 읽는 방법

이 GPU 시스템 시리즈는 단순히 "CUDA 문법을 외운다"가 목표가 아니다. 중요한 것은:

  • 커널이 어떤 병목을 가지는지
  • memory와 compute 중 무엇이 먼저 막히는지
  • 왜 특정 최적화가 의미가 있는지

를 설명할 수 있게 되는 것이다.

그래서 읽을 때는 예제를 외우기보다, 항상 아래 질문을 같이 들고 가는 편이 좋다.

  • 이 연산은 무엇을 계산하는가
  • 데이터는 어디에서 어디로 이동하는가
  • thread와 warp는 어떤 식으로 일하는가
  • 병목은 어디에서 생길 가능성이 큰가

이 질문이 습관이 되면, 이후 CUDA나 Triton 코드를 봐도 덜 막히고 더 오래 기억에 남는다.

다음 글부터는 본격적으로 GPU thread model, warp, block, memory hierarchy로 들어간다.