정보

DirectX 11을 이용한 멀티스레드 렌더링

DirectX 11에는 Immediate Context와 Deferred Context라고 하는 두 종류의 컨텍스트가 존재한다.

Immediate Context는 메인 스레드에서 렌더링하기 위해 사용하는 녀석으로, 서브리소스 매핑, 서브리소스 업데이트 등의 작업부터 시작하여 명령 리스트 실행도 담당하는 어떻게 보면 중앙 집중형 컨텍스트이다. 이 녀석이 없다면 실질적인 렌더링을 수행할 수 없다.

Deferred Context는 서브 스레드에서 렌더링하기 위해 사용하는 녀석으로, 다른 작업은 다 할 수 있지만 서브리소스 편집을 수행할 수 없다. 다만 동적 리소스의 경우 Map 작업은 수행할 수 있다. Deferred Context에서 작업한 결과는 당장 렌더링되지는 않는다. FinishCommandList 작업을 통해 먼저 지금까지 Deferred Context에서 작업했던 내용을 명령 리스트로 뽑아낸 뒤 Immediate Context에서 ExecuteCommandList를 수행해주어야 한다.

Deferred Context는 한 스레드 당 하나 씩만 만들 수 있으며, Immediate Context와 중복된 스레드에서는 생성되지 않는다. 즉, 메인 스레드에서는 생성되지 않는다. 모든 렌더링 오브젝트를 패러렐하게 루프를 돌면서 렌더링을 시킬 생각이라면 Deferred Context는 사용할 수 없거나 오버헤드가 싱글스레드 렌더링할 때보다 더 커질 수 있다. + (2016. 05. 11) 최근에 테스트 해보니 C# 기준으로 패러렐하게 루프를 돌리면 기본적으로 CPU 코어 개수 + 1개의 스레드가 패러렐 루프가 끝날 때까지 유지된다. 따라서 패러렐하게 루프를 돌리되, 객체를 나누는 기준을 설정하는 것이 중요할 것 같다.

8개 스레드를 생성하여 Deferred Context를 사용해 출력한다고 해도 8배 더 좋은 성능을 내지는 못한다. 이름에서 유추할 수 있듯 Deferred Context는 어디까지나 가장 중요한 작업만 지연된 작업을 하고 덜 중요한 작업은 멀티스레드 프로그래밍 할 수 있도록 하는 컨텍스트이고, 실질적인 모든 렌더링 작업은 Immediate Context에서 수행하기 때문이다. 8스레드 CPU에서 GTX 970으로 삼각형 렌더링을 수행한 결과 1.8배 성능까지는 나오는 것 같다. ※(2016. 02. 25.) 다른 사람들에게 말한 결과, 이보다 더 속도가 빨라져야 된다고 한다. 내 코드에 뭔가 미스가 있는 모양.

DirectX 11로 해볼 수 있는 간단한 작업들은 오늘 작업해본 Deferred Context 사용으로 다 해본 것 같다. 이제 같은 코드를 DirectX 12에서 구동했을 때 얼마나 성능 향상이 있는지 확인하기 위해 또 공부를 해봐야지…

광고

“DirectX 11을 이용한 멀티스레드 렌더링”의 3개의 생각

  1. Direct 11을 공부하고 있는 학생입니다. 저도 Deferred Context를 이용하여 멀티스레드를 통한 렌더링을 공부하는 중에 글을 보게 되어서 남기게 되었습다. 제가 간단히 해본 방식으로는 크게 성능향상을 느끼지 못하여서 어떤식으로 하셨는지 궁금해서 글을 남기게 되었습니다.

    하셨던 방식이나 혹은 연습삼아 구현해보신 로직을 배움을 얻고 싶은데 가능하시면 알려주십시요!
    메일은 raboom91@naver.com 입니다.

    좋아요

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중