[기타] Compute Shader
Compute Shader
Compute Shader는 GPGPU를 이용하여 동시에 수많은 연산을 병렬로 처리하는 쉐이더이다.
GPGPU는 GPU를 그래픽처리 뿐만 아니라 범용적인 계산에 사용하는 것을 칭한다. 즉 GPU의 활용 범위에 따라 GPU, GPGPU로 구분하는 것이다.
GPGPU는 병렬 형태의 계산 처리가 대량의, 간단한 연산에 효과적이기 때문에 쉐이더, 머신러닝등에 활용된다고 한다.
유니티에서는 CPU의 작업을 GPU에게 넘겨주어 최적화에도 활용할 수 있다고 한다.
Compute Shader를 활용하기 위해서는 GPU의 작업 처리를 이해할 필요가 있다.
Kernal
Kernal은 GPU에서 처리하는 작업의 단위이다. 하나의 함수라고 생각하면 될 것 같다.
Therad
Kernal을 실행하는 단위로 하나의 Thread가 한 종류의 Kernal을 실행한다.
Thread는 x, y, z 3차원으로 구성되며 x * y * z개의 Kernal이 동시에 실행된다.
Thread Group
Thread를 실행하는 단위이다.
마찬가지로 x, y, z,3차원으로 구성되며 x * y * z개의 Thread가 동시에 실행된다.
x, y, z는 [numthreads(x, y, z)]로 결정하며 Compute Shader를 실행하는 함수 Dispatch()에 매개변수로 사용된다.
총 Thread개수는 32의 배수로 최대 256개를 지정하는 하는 성능에 좋다고 한다.
예) [numthreads(256, 1, 1)], [numthreads(16, 16, 1)], [numthreads(8, 8, 4)]
너무 많이 할당하면 Thread가 일을 하지 않고 놀아 낭비가 될 수 있으므로 적절한 크기로 설정해야 한다.
차원은 계산할 데이터의 차원에 따라 결정되는데, 예를 들어 int, float같은 데이터면 1차원, 렌더 텍스쳐와 같은 데이터면 2차원으로 결정되는 식이다.
Compute Buffer
CPU와 GPU가 데이터를 주고 받기 위해 사용된다.
쉐이더 내부에서는 RWStructuredBuffer<T>(읽기, 쓰기), StructuredBuffer<T>(읽기)로 매핑된다.
int, float, Vector 또는 구조체의 배열 변수 등을 공유할 수 있다.
생성자
- ComputeBuffer(int count, int stride)
- ComputeBuffer(itn count, int stride, ComputeBuffreType type)
count : 버퍼 내의 요소의 개수이다, 배열의 길이라고 생각하면 된다.
stride : 버퍼 요소 하나의 크기로 버퍼의 데이터의 타입과 같아야 한다.
type : 쉐이더의 내용과 변수에 따라 달라진다. 기본은 Default이며, RWStructuredBuffer, StructuredBuffer를 나타낸다.