본문 바로가기

GPU-KERNEL

여기서 다시 한 번 GPU 실행 단위 정리하기

GPU 실행 구조 - Grid - Block - SM - Warp - Thread

 

Grid

  • 전체 커널 실행 범위
  • 하나의 kernel launch = 하나의 grid
  • grid 안에 여러 block 이 존재

이 커널을 몇 개의 block 으로 나눠서 돌릴지를 결정하느 ㄴ단위

 

Block

  • SM 에 스케줄되어 올라가는 기본 단위
  • 블록 안에는 thread 가 여러 개
  • 블록 간에는 서로 공유 메모리나 sync 불가능

병렬 작업 단위이자, shared memory 와 barrier 를 함께 가짐

 

SM ( Streaming Multiprocessor )

  • GPU 내부의 코어 클러스터
  • 여러  block 을 동시에 수용
  • 내부에서 warp scheduler 가 warp 를 번갈아 실행하며 latency hiding 수행
  • SM 안에는
    • Register file
    • Shared memory / L1
    • Tensor Core
    • Warp schedulers
    • ALUs, LD/ST Units, SFUs 등

 

Warp 

  • 스케줄링의 실제 최소 실행 단위 (32 threads 고정)
  • block 안의 threads 는 32개씩 묶여 warp 를 이룸 
  • warp 한 개는 동ㅇ리한 instruction 을 lockstep 으로 실행
    • branch divergence 발생 시 split - serialization

실제로 실행되는 것은 thread 단위가 아니라 warp 단위이다.

 

Thread

  • block 내부에서의 실제 작업자
  • register 와 local memory 를 독립적으로 가지고 있음
  • 실행은 warp 단위로 묶여서 실행됨

프로그래머가 보는 추상적 실행 단위

실제로는 warp 의 lane 하나가 thread 하나

 

Lane ( 워크 안의 스레드 슬롯 )

정의

  • Warp 내부의 thread index
  • warp = 32 threads -> lane 0 ~ 31

특징

  • warp 는 32 개의 lane 을 lockstep 으로 실행
  • branch 로 갈라지만 lane 단위로 마스크 씌워서 serialization 
  • warp-level intrinsic 등은 lane 간 통신

 

Bank (Shared Memory 의 물리적 분할 구조)

정의

  • Shared memory 는 32 개의 bank 로 물리적으로 나뉘어 있음
  • 각 bank 는 한 번에 32개의 요청 처리 가능
  • 하나의 warp 가 접근할 때
    • lane 0 - bank (주소 % 4)
    • lane 1 - bank (주소 % 4)
    • ...

즉, 주소가 32 개의 bank 구간에 어떻게 떨어지느냐가 핵심

 

한 warp 가 shared memory load / store 수행 시 

각 lane 이 접근한 shared memory 주소가 같으면 conflict 발생 ( broadcast 는 괜찮음 )