GPU 스케줄러는 원하는 block 을 모두 동시에 실해하지 않는다.
제한된 수의 block 만 SM 에 올려서 처리, 나머지는 대기 큐에 머문다.
즉, SM 개수가 곧 병렬성의 실제 상한
기본 구조
총 SM 수 = 80
grid = 1000 blocks
block당 thread = 256
실행 흐름:
80개 block만 동시에 실행
다른 920개 block은 큐에서 기다림
총 SM 개수, occupancy, register/shared mem 사용량에 따라 한 번에 올릴 수 있는 block 개수를 최적화하는 게 핵심이 된ㄷ.ㅏ
Real Strategy - "Block > SM is a must"
block 개수는 반드시 SM 개수보다 훨씬 많아야 한다. 그래야 SM 을 100% 점유 가능
block = SM : 1 block/SM -> Warp 끝나면 idel, 낮은 활용도
block = SM x 10 : SM 마다 대기 block whswo , 높은 활용도
block = SM x 50 : 충분히 대기 block 많음, 안정적
즉, -> grid size must be >> SM_count
왜? Warp 끝날 때마다 바로 다음 block 을 얹어야 idle 없음
그럼 block 당 thread 수는? (thread/block)
block 당 thread 수는 SM 의 warp scheduler * register 수와 연관됨
block 당 thread
( 64 ~ 128 ) : latency hiding 약하지만 너무 좁음
256 : warp 8 개 = SM scheduler 에 적합하지만, general recommend
( 512 ~ 1024 ) : register pressure ↑, occupancy ↓, 커널 한정 최적화
따라서 block_size = 256 은 일반적인 sweet spot
'GPU-KERNEL' 카테고리의 다른 글
| cudaGetDeviceProperties - 3080ti laptop (0) | 2025.11.20 |
|---|---|
| Register Pressure -> Warp Scheduler -> Occupancy -> (Nsight 타임라인 구조) (0) | 2025.11.20 |
| Shared memory 을 선언한 순간! ( block, warp, bank, thread ) - 사용자 관점 실제 GPU 관점 (0) | 2025.11.20 |
| GEMM 확장 방향성 - 현재 완전 기본적인 shared memory, tiling 사용 중 (0) | 2025.11.19 |
| A, B 행렬의 BK 슬라이스, Shared Memory 상 upload ( shared memory 는 커널을 런치할 때 결정된다. ) (0) | 2025.11.19 |