-
Compute Shader & CUDA-Python게임 개발 2021. 6. 22. 04:59
- SIMT(Single Instruction, Multiple Thread)
- SIMD(Single Instruction, Multiple Data) 에서 변형된 방식. Multiple Thread로 인해서 그래픽 처리나 AI처리에 알맞다.
- NVIDIA GPU (물리적 구성)
- 따라서 RTX 3080 Ti의 코어개수는 32 * 4 * 80 = 10,240 이 된다.
- Compute Shader (논리적 구성)
- Dispatch()는 최초 실행하는 시점이다. Unity C#은 내장된 Dispatch()를 호출하고 파이썬은 함수객체를 직접 호출한다. 크기는 런타임에 변경할 수 있다.
- Thread Group(Block)은 Thread를 모은 덩어리다. Compute Shader에서는 컴파일 타임에 정해야한다.
- Thread가 우리가 알고 있는 분산 실행되는 함수이다.
- Dispatch 후 Thread Group(Block)의 분배
- Thread Group(Block)은 그래픽 카드의 각각의 SM으로 분배된다. 순서의 보장은 없다.
- 아마도 큐로 대기 탈것이다.
- Thread의 분배
- 각각의 Thread들은 WARP 스케쥴러로 분배된다.
- 이제부터 중요한데 코드에서 분기가 생긴다면 같은 WARP에서 같은 분기를 타는것이 성능에 좋다. (이것이 SIMT의 핵심)
- 이 분배 된 상태에서 분기가 갈라진다면 먼저 실행한쪽은 진행되고 갈린쪽은 대기를 탄다.
- 이 Core는 Shader Unit이기도 하다. (어차피 픽셀 단위로 계산하는 유닛) 따라서 최적화 방식도 비슷하다.
- Thread Group이 우연히도 128개고 SM의 총 갯수도 128개이다. 그 외 모든 환경이 맞아 떨어진다면 효율이 최상급이 된다. Occupancy = (가동 Warp 갯수) / (최대 Warp 갯수)
- 언어별 차이
-
호출 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 - SIMT(Single Instruction, Multiple Thread)