Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- C언어
- View
- 코딩
- DirectXTK
- C++
- Input Assembler
- Direct Init
- 전처리문
- engine
- GPU
- DirectX
- vertex
- c
- 세팅
- CPU
- DESC
- 다이렉트X 튜토리얼
- 게임수학
- UE4
- Direct3D
- CommandList
- 다이렉트 초기화
- swapchain
- RenderTargetView
- 다이렉트X
- 동기화
- DirectX12
- 다중표본화
- 프로그래밍
- Direct3D Init
Archives
- Today
- Total
비타Cpp
CPU와 GPU의 상호작용 - CPU/GPU 동기화 본문
한 시스템에서 두 개의 처리 장치가 병렬로 실행되다 보니 여러 가지 동기화 문제가 발생한다.
이런 문제의 해결책 하나는 GPU가 명령 대기열의 명령들 중 특정 지점까지의 모든 명령을 다 처리할 때까지 CPU를 기다리게 하는 것이다. 대기열의 모든 명령을 처리하는 것을 가리켜 Flush(방출)이라고 한다. 이때 필요한 것이 Fence(울타리)라고 부르는 객체이다. Fence는 ID3D12Fence 인터페이스로 대표되며, GPU와 CPU의 동기화를 위한 수단으로 쓰인다. 다음은 Fence 객체를 생성하는 메서드이다.
HRESULT CreateFence(
UINT64 InitialValue,
D3D11_FENCE_FLAG Flags,
REFIID ReturnedInterface,
void **ppFence
);
//예:
ThrowIfFailed(md3dDevice->CreateFence(
0,
D3D12_FENCE_FLAG_NONE,
IID_PPV_ARGS(&mFence)));
Fence객체는 UINT64 값 하나를 관리 한다. 이 값은 그냥 시간상의 특정 울타리 지점을 식별하는 정수이다. 앞으로의 예제들은 처음(Fence 지점이 하나도 없는 상태)에는 이 값을 0으로 두고, 새 울타리 지점을 만들 때마다 이 값을 1씩 증가시킨다. 다음은 울타리를 이용해서 명령 대기열을 비우는 방법을 보여주는 코드이다.
UINT64 mCurrentFence = 0;
void D3DApp::FlushCommandQueue()
{
//Advance the fence value to mark commands up to this fence point.
mCurrentFence++;
//Command 큐에 명령을 추가하여 새 Fence 포인트를 설정해야 한다.
//GPU 타임라인에 있어서, Signal() 이전의 모든 명령이 처리될때까지 새 Fence 포인트가 설정되지 않기 때문이다.(무슨말이야!!)
ThrowIfFailed(mCommandQueue->Signal(mFence.Get(), mCurrentFence));
//GPU가 이 Fence 포인트까지 명령을 완료할때까지 기다린다.
if (mFence->GetCompletedValue() < mCurrentFence)
{
HANDLE eventHandle = CreateEventEx(nullptr, false, false, EVENT_ALL_ACCESS);
//GPU가 현재Fence에 도달하면 이벤트가 발생.
ThrowIfFailed(mFence->SetEventOnCompletion(mCurrentFence, eventHandle));
//GPU가 현재Fence에 발생한 이벤트에 도달할 때까지 대기.
WaitForSingleObject(eventHandle, INFINITE);
CloseHandle(eventHandle);
}
}
위의 코드는 GPU의 현재 명령들이 완료 되기 전까지 CPU는 놀게 된다. 이러한 방식은 좋은 방식은 아니다. 다행히 간단한 해결방법이 있지만 이는 다음에 수정하겠다.
'DirectX12 > 메모' 카테고리의 다른 글
CPU와 GPU의 상호작용 - 자원 상태 전이 (0) | 2021.10.01 |
---|---|
CPU와 GPU의 상호작용 - Command Queue, Comand List (0) | 2021.09.27 |
렌더링 파이프 라인 - Tessellation Stage(테셀레이션 단계) (0) | 2021.08.06 |
렌더링 파이프 라인 - VS(Vertex Shader) Stage - 투영과 동차 절단 공간 (0) | 2021.08.06 |
렌더링 파이프 라인 - VS(Vertex Shader) Stage - View Space (0) | 2021.08.05 |
Comments