1.
작업관리자를 열었다가 희안한걸 보게 됐다.
평소에도 컴퓨터의 반응이 굼떠지면 제일 먼저 확인하는 곳이 바로 작업관리자다.
그도 그럴 것이.. 여기에서 거의 대부분의 문제를 해결할 수 있었기 때문이기도 하다. 그런데 열어보다가 궁금한 점이 하나 생겼다. 언제부턴가 ‘GPU 엔진’이라는 항목이 생겼고,
거기엔 또 GPU Copy 및 3D같은 것들이
보였다. 이게 대체 뭘까?
2.
GPU 엔진이 하는 일은 뭘까?
당연히 게임! 이라고 대답하기엔 호기심이 해결되지 않는다. 초창기 그래픽카드의 역할은 모니터에 그림을 그려주는 것이었다. 우리가
모니터를 통해 글자를 볼 수 있는 것도 모두 글자의 생김새를 모니터에 점을 찍어 나타내고 있는 것이다. 1990년대까지만
하더라도 이러한 간단한 작업은 CPU가 처리해주었지만, 그래픽
작업을 전문적으로 수행하는 소프트웨어 및 게임을 위해 GPU가 발전하게 되었다.
요즘은 가상화폐 채굴과 인공지능을 위한 GPU가 더 각광받는 것 같긴 하다.
그런데 운영체제에서도 GPU를 적극적으로 활용하고 있다. 대표적으로 윈도우 7 사용자라면 멋을 위해 사용해봤을 법한 Windows 7 Aero Theme이 있다.
유리처럼 반짝이는 이 기능을 더 예쁘게 사용하고 싶어서 컴퓨터도 새로 맞추고 이런저런 테마를 적용해보고 가꿔본
기억이 난다. 그런데 이 기능은 보기보다 GPU 메모리를
많이 먹을 뿐더러, CPU 자원까지 잡아먹는다!
윈도우에서 열려있는 창(window)의 시각 효과를 담당하는 것이
바로 Desktop
Window Manager (DWM)이다. 위에서 언급한 유리 창틀 효과를 비롯해
3D 창 전환 애니메이션, 화면의 플립(Flip) 및 고해상도 지원 등을 담당하고 있다. 영상 제작에서 자주
쓰이는 composition이라는 단어의 어원은 라틴어인 componere에서
유래했는데, 이는 우리말로 ‘같이 놓다(put together)’라는 뜻이다. 데스크탑에서 창들을 위치별로
그려내는 일을 하는 녀석이 바로 DWM이라고 생각하면 된다.
SuperUser의 게시물에
따르면 Visual Studio, PHPStorm, Aptana Studio, Chrome, Firefox, IE
등등 GPU 메모리를 소비하지 않는 프로그램을 찾기 힘들 정도이고, GPU 코어의 사용량이 높지 않아도 GPU 메모리가 일정 수준을
넘어서게 되면 OS 차원에서 관리하기 위해 Desktop
Compositing의 일부 기능을 정지시켜 GPU 메모리를 절약한다. GPU 메모리의 약 75% 사용량에 도달할 시 윈도우는 데스크탑
컴포지션을 비활성화시키지만 전체화면 애플리케이션을 사용하고 있는 경우엔 데스크탑 컴포지션이 비활성화되지 않으며,
이 때문에 전체화면으로 게임을 하는 경우엔 게임의 요구사양을 충분히 만족하는데에도 ‘Windows
has detected that your computer’s performance is slow’ 메시지가 뜰 수 있는 것이다.
이처럼 운영체제 자체에서도 GPU는 많이 사용되고 있다. 뿐만 아니라 크롬에서도 GPU 가속 설정을 지원하고 있다. 여담으로 크롬에서 하드웨어 가속 설정에 관한 토론을 퀘이사존 게시물에서
찾을 수 있었다. 꺼야 할지 켜야 할지 모르겠다면 위의 토론을 읽어보고 판단하면 좋을 것 같다.
3.
‘성능’탭에서
GPU 사용 환경을 체크할 수 있다.
그래서 다시 본래의 호기심으로 돌아오자면.. ‘OS가 GPU를 쓰는 것까진 알겠는데, 그럼 3D나 Copy 이런건 뭘까’싶다. 이는 레딧의 도움을 받아 마이크로소프트 개발자 블로그를 통해 확인할 수 있었다.
A GPU engine represents an independent unit
of silicon on the GPU that can be scheduled and can operate in parallel with
one another. For example, a copy engine may be used to transfer data around
while a 3D engine is used for 3D rendering. While the 3D engine can also be
used to move data around, simple data transfers can be offloaded to the copy
engine, allowing the 3D engine to work on more complex tasks, improving overall
performance. In this case both the copy engine and the 3D engine would operate
in parallel.
번역: GPU 엔진은 스케줄화 될 수 있고 병렬로 작동할 수 있는
GPU의 독립적인 단위를 말한다. 예를 들어서, copy 엔진은 3D 엔진이 3D
렌더링을 진행하는 동안에 데이터를 상호 교환하는 데에 사용될 수 있다. 3D 엔진을 사용해서
데이터를 전송할 수도 있지만, 3D 엔진이 다른 복잡한 작업을 할 수 있도록 copy 엔진에게 데이터 전송 업무를 분담함으로써 전체적인 성능 향상에 기여한다.
이런 경우엔 copy 엔진과 3D 엔진이 모두
병렬적으로 작동한다.
GPU를 도식화한 그림을 위와 같다.
기본적으로 작업관리자는 4개의 엔진을 화면에 표시해준다.
화면에 표시할 엔진을 선택하는 기준은 ‘이 엔진이 얼마나 관심있게 볼만한 엔진인가’이라고 한다. 원한다면 사용자가 엔진 이름을 클릭해서 다른 엔진의
상태들을 모니터링할 수 있다.
그런데 엔진들의 이름들이 반드시 역할에 종속적인 것만은 아니다. 3D 엔진이
열일하고 있을 때엔 compute 엔진이 data transfer를
담당하기도 하고, GPU 드라이버가 판단하기에 영상 재생 중 decode
엔진이 바쁘다면 주어진 작업을 여러 개의 엔진을 조합시켜 수행할 수도 있다.
또한 ‘Copy’는 시스템 메모리에서 GPU 메모리로 데이터를 복사해오는 것을 의미한다.
VidSch가 바로 GPU 엔진을
사용하고자 하는 프로세스들 사이에서의 우선순위 결정 및 중재를 담당하고 있다.
GPU 엔진과 GPU 코어를
구분할 필요가 있다. GPU 엔진은 수많은 GPU 코어들로
구성되어 있다. 예를 들어서 3D 엔진은 대략 천 여개의
코어들로 구성되어 있으며, 이들은 그룹화되어 관리되기 때문에 통틀어서 ‘엔진’이라고 부르는 것이다.