본문 바로가기

Graphics

[Optimization][Assembly] GPU Instruction 최적화 - 상수 값 사이의 연산 줄이기

셰이더 내부에서 처리하던 상수 값 사이의 연산을 CPU 에서 처리하게 하면, GPU Instruction 이 줄어들어 셰이더의 GPU 실행 속도가 빨라질 수 있다.

 

코드 예시:

float GetDepthSlice (float SceneDepth)
{
	float MinDepth = ViewUniformBuffer.DepthStartDistance;
	float MaxDepth = ViewUniformBuffer.DepthScale * 1000.0f;
    
	float DepthSlice = (SceneDepth - MinDepth) / (MaxDepth - MinDepth);
	return saturate(DepthSlice);
}

 

위 함수에서, SceneDepth 를 제외한 나머지 값들은 모두 UniformBuffer 에서 읽어오는 값이다.

GPU 의 모든 스레드가 동일한 값을 읽어 사용하기 때문에 MinDepth 와 MaxDepth 는 상수이다.

 

최적화할 수 있는 부분은 DepthSlice 를 계산하는 곳이다.

SceneDepth 를 제외한 나머지 상수 부분 연산을 CPU 로 옮길 수 있다.

상수 부분 연산을 CPU 로 옮기면 셰이더 코드를 A * x + B 형태로 바꿀 수 있다.

 

기존 코드의 수식을 그대로 컴파일 하면 3개 이상의 GPU Instruction 이 필요하다.

하지만 A * x + B 형태로 수식을 맞추면 1개의 GPU instruction 만 사용해서 컴파일 된다.

 

실행시키는 GPU Instruction 의 수가 적어지므로, 셰이더의 GPU 실행 속도도 빨라진다.