기본형 : 모든 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 단위 독립 구간을 만들어야 한다.
'GPU-KERNEL' 카테고리의 다른 글
| warp 에 이은 lane specialization?? (0) | 2025.12.15 |
|---|---|
| 여기서 다시 한 번 GPU 실행 단위 정리하기 (0) | 2025.12.11 |
| Softmax Micro kernel Design (0) | 2025.12.10 |
| 이상적인 Epilogue Kernel 구현 - FlashAttention 을 보며... (1) | 2025.12.09 |
| Nsight Compute / ncu 권한 문제 해결 가이드 (Windows + GeForce) (0) | 2025.12.04 |