ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Compute Shader & CUDA-Python
    게임 개발 2021. 6. 22. 04:59
    1. SIMT(Single Instruction, Multiple Thread)
      • SIMD(Single Instruction, Multiple Data) 에서 변형된 방식. Multiple Thread로 인해서 그래픽 처리나 AI처리에 알맞다.
    2. NVIDIA GPU (물리적 구성)

      • 따라서 RTX 3080 Ti의 코어개수는 32 * 4 * 80 = 10,240 이 된다.
    3. Compute Shader (논리적 구성)

      • Dispatch()는 최초 실행하는 시점이다.  Unity C#은 내장된 Dispatch()를 호출하고 파이썬은 함수객체를 직접 호출한다. 크기는 런타임에 변경할 수 있다.
      • Thread Group(Block)은 Thread를 모은 덩어리다. Compute Shader에서는 컴파일 타임에 정해야한다.
      • Thread가 우리가 알고 있는 분산 실행되는 함수이다.
    4. Dispatch 후 Thread Group(Block)의 분배

      • Thread Group(Block)은  그래픽 카드의 각각의 SM으로 분배된다. 순서의 보장은 없다.
      • 아마도 큐로 대기 탈것이다.
    5. Thread의 분배

      • 각각의 Thread들은 WARP 스케쥴러로 분배된다.
      • 이제부터 중요한데 코드에서 분기가 생긴다면 같은 WARP에서 같은 분기를 타는것이 성능에 좋다. (이것이 SIMT의 핵심)
      • 이 분배 된 상태에서 분기가 갈라진다면 먼저 실행한쪽은 진행되고 갈린쪽은 대기를 탄다.
      • 이 Core는 Shader Unit이기도 하다. (어차피 픽셀 단위로 계산하는 유닛) 따라서 최적화 방식도 비슷하다.
      • Thread Group이 우연히도 128개고 SM의 총 갯수도 128개이다. 그 외 모든 환경이 맞아 떨어진다면 효율이 최상급이 된다. Occupancy = (가동 Warp 갯수) / (최대 Warp 갯수)
    6. 언어별 차이
      •   호출 Thread Group(Block) 하나 Thread Group(Block) 모음
        unity Dispatch() numthreads(x, y, z) Dispatch(kernelID, x,y,z) 
        pycuda 함수객체 (c언어 소스) block=(x, y, z) grid=(x,y,z)
        numba 함수객체 (python) [(x, y, z), ...]() [..., (x, y, z)]()

    '게임 개발' 카테고리의 다른 글

    Tangent Space 와 삼각함수  (0) 2021.06.06
    URP 약어  (0) 2021.06.05
    MetaHuman to ALS v4 for UE4 #2  (0) 2021.06.01
    MetaHuman to ALS v4 for UE4 #1  (0) 2021.05.26
    S3, DXT, BC  (0) 2021.01.06

    댓글

Designed by Tistory.