CPU와 GPU의 핵심적인 차이는 코어의 갯수이다.
CPU는 코어가 몇 개 안되지만 GPU는 엄청 많음 (몇 천개 단위..)
하지만 코어 하나의 성능은 CPU가 더 똑똑하다
CPU는 이것 저것 많은 일들을 처리해야 하기 때문 (일당백)
모든 일감이 독립적으로 실행되는 경우
예를 들면 이전의 작업과 지금의 작업이 아무 관련이 없어서 병렬로 실행되어도 아무 문제 없는 경우
GPU에게 단순 작업을 떠넘길 수 있다.
UAV(Unordered Access View)
- u0~un이 컴퓨트쉐이더에서 사용하는 레지스터이다.
쉐이더코드에서 제공하는 Texture중 RWTexture2D라는 텍스쳐가 있는데,
RW는 Read/Write를 의미하며 특이하게도 Write가 가능한 텍스쳐다.
이 텍스쳐는 픽셀 하나하나당 일감을 처리하는 스레드로 볼 수 있다
(gpu에서 스레드는 하나의 일감)
#ifndef _COMPUTE_FX_
#define _COMPUTE_FX_
#include "params.fx"
RWTexture2D<float4> g_rwtex_0 : register(u0);
// 쓰레드 그룹당 쓰레드 개수
// max : 1024 (CS_5.0)
// - 하나의 쓰레드 그룹은 하나의 다중처리기에서 실행
[numthreads(1024, 1, 1)]
void CS_Main(int3 threadIndex : SV_DispatchThreadID)
{
if (threadIndex.y % 2 == 0)
g_rwtex_0[threadIndex.xy] = float4(1.f, 0.f, 0.f, 1.f);
else
g_rwtex_0[threadIndex.xy] = float4(0.f, 1.f, 0.f, 1.f);
}
#endif
- numthreads는 쓰레드 그룹에 속한 쓰레드 갯수를 의미한다.
- 괄호에 들어가는 숫자는 순서대로 x, y ,z축의 갯수를 의미(3차원 배열을 생각할 수 있다)
- 또 Dispatch라는 함수로 이 그룹을 다시 3차원 배열의 요소로 표현한다.
void Material::Dispatch(uint32 x, uint32 y, uint32 z)
{
// CBV + SRV + SetPipelineState
PushComputeData();
// SetDescriptorHeaps + SetComputeRootDescriptorTable
GEngine->GetComputeDescHeap()->CommitTable();
COMPUTE_CMD_LIST->Dispatch(x, y, z);
GEngine->GetComputeCmdQueue()->FlushComputeCommandQueue();
}
- CBV, SRV를 다 세팅해 준 후 PushComputeData 함수를 통해 UAV까지 세팅한다.
- 그 후에 ComputeDescriptorHeap을 전담하는 클래스에서 CommitTable로 GPU에 매핑하고,
- Dispatch에서 쓰레드 그룹을 세팅해준 후 FlushComputeCommandQueue에서 작업을 진행한다.
'DirectX > [Inflearn_rookiss] Part2: DirectX12' 카테고리의 다른 글
27. Particle System_2 (0) | 2023.02.14 |
---|---|
26. Particle System_1 (0) | 2023.02.13 |
24. Multi Render Target (1) | 2023.02.04 |
23. Orthographic Projection (0) | 2023.02.02 |
22. Quaternion - 개념과 사용 방법 (0) | 2023.02.01 |
댓글