본문 바로가기

GPU-KERNEL

각 warp 는 다른 일을 담당할 수 있다...

기본형 : 모든 warp 가 동일한 일을 한다.

대부분의 CUDA 커널으느 이렇게 짠다.

  • warp 0 - row 0 ~ 15
  • warp 1 - row 16 ~ 31 
  • ...

즉, 각 warp 가 동일한 연산 패턴을 서로 다른 데이터에 대해 반복한다.

 

고급형 : Warp Specialization

warp 는 동일한 일을 하는 게 아니라, 공장 라인의 서로 다른 작업자

  • warp 0 : QK
  • warp 1 : softmax reduction 
  • warp 2 : PV GEMM
  • warp 3: ...

이런 구조는 고급 커널에서 작동

 

왜 이런 구조가 나타났냐면..

  • GPU 스케줄러는 warp 단위로 스위칭
  • warp 가 서로 다른 종류의 stall / latency 를 가지면, 
  • 그 stall 시간을 서로 덮으면서 SM 을 더 꽉 채울 수 있다.

서로 다른 자원을 쓰는 warp 들을 섞으면 stall 이 서로 겹쳐져 보이지 않게 되고 overall throughput 이 올라간다.

 

stall 개념에서 접근.

일반적으로는 같은 일을 병렬적으로 하는 구조가 stall 이 적다. 

GPU 는 SIMT 기반, 

  • 워프 내 모든 스레드가 같은 instruction 을 실행
  • 같은 일을 하는 warp 가 많을수록 스케줄러가 선택할 수 있는 ready warp 가늘어난다. 
  • 메모리 접근 패턴도 정려되기 쉬어 stall 이적다.

이러한 이유로 일반적인 커널은 warp 모두 동일한 일을 수행

 

 

warp 각각이 서로 다른 파이프 라인, 독립적이면, stall 이 서로 겹치지 않고 서로의 공백을 채운다. 

필요한 정확한 지점에서 sync 을 넣고 warp 단위 독립 구간을 만들어야 한다.