728x90
책들을 봐도 잘 이해가 안되는 것 같아서 따로 찾아보다가 좋은 예시를 찾았다...
큰 그룹으로 나누어 주는 API 는 ID3D11DeviceContext::Dispatch() 이다.
ipImmediateContextPtr->Dispatch( 3, 2, 1 );
이렇게 큰 블럭 단위로 나누고 난 후에 ComputeShader HLSL 에서는 이들을 세부적인 스레들로 분할하는 문법을 지정한다.
[numthreads(4, 4, 1)]
void MainCS( ... )
{
....
}
결과적으로 위의 그림처럼 스레드들이 생성되어서 병렬적으로 실행이 된다.
위에 나열된 숫자들은 스레드 ID 로써의 역활을 한다.
즉, 어떤 스레드의 ID 가 MainCS 함수에 파라메터로 넘어오면,
그 ID 를 통해서 해당 버퍼에 값을 작성하게 된다.
예를 들어,
[numthreads( 256,1,1) ]
void VectorAdd( uint3 id: SV_DispatchThreadID )
{
gBufOut[id] = gBuf1[id] + gBuf2[id];
}
아무리 스레드들이 복잡하게 동작하더라도, 위와 같이 ID 를 통해서 제어한다면
그 어떤 작업도 문제없이 할 수 있다.
728x90
'Visualization Programming > DirectX11' 카테고리의 다른 글
DirectX11 - Deferred Context Memory Leak (0) | 2016.06.30 |
---|---|
DirectX11 - UpdateSubResource(), Map() ~ Unmap(), CopyResource(), CopySubresourceRegion()의 팁 (0) | 2016.04.15 |
DirectX11 - DirectCompute 메모리 모형 (0) | 2016.03.16 |
DirectX11 - DirectCompute의 스레드 (0) | 2016.03.09 |
DirectX11 - 계산 파이프라인란? (0) | 2016.03.08 |