반응형
사내에서, GPGPU와 Unity를 활용한 Compute Shader에 대해 세미나를 진행할 일이 생겨서 PPT를 정리하면서 개념을 다시 한번 요약해보았다. 석/박때 공부했던 내용들과 최근에 올라온 각종 자료들을 취합해서 요약한 자료를 블로그에도 포스팅한다. 기회가 되면 유니티에서 활용하기 쉬운 예제들로 포스팅을 이어가볼 예정이다.
- GPGPU
- General-Purpose computing on Graphics Processing Units
- 일반적으로 컴퓨터 그래픽스를 위한 계산만 맡았던 그래픽 처리 장치(GPU)를, 전통적으로 중앙 처리 장치(CPU)가 맡았던 응용 프로그램들의 계산에 사용하는 기술
- GPGPU 구현 API & 프레임워크
- OpenGL Compute Shader
- DirectX DirectCompute
- OpenCL
- CUDA (“Compute Unified Device Architecture”, 쿠다)
- GPU를 이용하여 C-언어를 비롯한 각종 표준 언어를 사용하여 computer graphics 작업이 아니라 일반적인 과학기술용 해석작업을 수행할 수 있도록 하는 GPGPU의 발전 형태
- NVIDIA에서 개발하고 있어, CUDA 프로그래밍을 위해서는 NVIDIA GPU가 필수적임
- CPU vs GPU Architecture
- GPU는 CPU에 비해 월등히 많은 양의 ALU를 보유하고 있어, 대용량 연산에 용이함
728x90
- Compute Shader
- OpenGL 4.3에서 등장한 GLSL 기반 연산용 쉐이더
- GPGPU 환경을 구축할 수 있으며, CPU와 GPU 간 Buffer 통신을 지원함
- Unity Compute Shader
- DirectX 11 스타일의 HLSL로 구현된 연산용 쉐이더
- VFX Graph도 Compute Shader를 사용함
- 확장자는 .compute를 사용함
- Kernel, Thread, Thread Group의 개념이 존재함
- Kernel
- GPU에서 동작하는 함수
- 함수의 이름 = 커널의 이름
- #pragma kernel functionName
- Thread
- 커널을 실행하는 단위
- 하나의 스레드가 하나의 커널을 실행함
- 스레드의 개수는 3차원으로 구성됨(x, y, z)
- 커널 선언부 상단에 [numthreads(x, y, z)]를 붙여 스레드의 개수를 3차원으로 지정함
- Thread Group
- 하나의 스레드 그룹 당 [numthread(x, y, z)] 로 지정된 개수만큼의 스레드를 실행함
- 스레드 그룹의 개수는 Compute Shader 객체를 실행할 때 지정함
- Dispatch 함수로 객체를 실행할 수 있음
- 개수는 3차원(x, y, z)로 구성됨
- Unity ComputeShader Class API
- Dispatch(int kernalIndex, int x, int y, int z) : void
- FindKernal(string name) : int
- GetKernelThreadGroupSize(...) : void
- SetFloat(...) : void
- SetFloats(...) : void
- SetVector(...) : void
- SetMatrix(...) : void
- SetTexture(...) : void
- SetBuffer(...) : void
- GetBuffer(...) : ComputeBuffer
SMALL
- Compute Buffer
- Compute Shader를 사용할 때 CPU와 GPU 간 데이터 통신을 위해 사용하는 Class
- Compute Shader뿐 아니라, Vertex / Fragment / Geometry 등 다양한 쉐이더에서 사용할 수 있음
- 쉐이더 내부에서는 RWStructuredBuffer<T>, StructuredBuffer<T> 타입으로 매핑됨
- 개별 타입(float, Vector4 등) 또는 구조체의 배열 변수를 공유 데이터로 사용함
- 구조체를 사용할 경우 CPU & GPU 모두 동일하게 선언해야함
- Unity ComputeBuffer Class API
- SetData(...) : void
- SetData(Array data)
- SetData(List<T> data)
- SetData(NativeArray<T> data)
- SetData(data, int arrayIndex, int bufferIndex, int count)
- GetData(...) : void
- GetData(Array data)
- GetData(Array data, int arrayIndex, int bufferIndex, int count)
- Release() : void
- Compute Buffer 해제 / OnDestroy()에서 호출해줘야 함
- SetData(...) : void
[GPU]
[CPU]
반응형
'개발 > Unity' 카테고리의 다른 글
Unity에서 Json .Net 사용하기 (0) | 2022.01.19 |
---|---|
URP Light Probe Group (0) | 2021.12.05 |
PlayerPrefs로 데이터 관리하기 (0) | 2021.11.03 |
C#, Unity 소수점 자리수 바꾸기(올림, 내림, 반올림) (0) | 2021.11.01 |
Unity - 멀티 디스플레이 활성화 후 안보이게하고싶을 때 (0) | 2021.08.31 |