하드웨어 가속 디코딩을 꺼서 인코딩 속도를 높이기

by JKyle posted Jun 19, 2018
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

웬 뚱딴지 같은 제목이냐 하실 분들도 계시겠지만, 일반적인 상황이 아니라 추가 그래픽 카드가 있는 상황이어서 하드웨어 가속 인코더를 사용하지만 CPU 사용 비중이 높은 소프트웨어 필터(대표적으로 샤나의 리사이즈/해상도 변경 필터인 scale)를 사용하는 경우에 한해서 드리는 말씀입니다.

 

좀 원론적인 얘기를 드리자면, 샤나에서 하드웨어 가속을 선택해서 얼마나 속도 향상을 얻을 수 있느냐 하는 문제에 대한 답을 구하기 위해서는 하드웨어 가속의 작동 메커니즘을 파악해야 합니다.

 

샤나에서 하드웨어 가속 인코딩, 그중에서도 NVENC를 이용하는 경우를 예를 들어 보겠습니다. (AMD의 AMF 계열 인코더는 샤나에서 메뉴로 제공하지 않습니다.)

 

'인코딩'이라고 통칭하는 재인코딩, 혹은 트랜스코딩 과정은 개념적으로 간략하게 다음과 같습니다. (워크플로우 자체는 샤나든 다른 프로그램이든 동일합니다.)

 


 

디코딩: 선택에 따라 소프트웨어 디코딩(CPU) vs 하드웨어 디코딩(GPU. 샤나에서는 DXVA2를 통해서만 가능했으나 4.9 버전부터는 D3D11, NVDEC 등 좀 더 다양해짐.)

 

---> 해상도 변경: 리사이징/해상도 변경 필터에 따라 CPU 또는 GPU가 담당하지만 샤나는 소프트웨어 필터인 scale(CPU)만 가능

        (+ 기타 필터 작업)

 

---> 인코딩: 소프트웨어 인코딩(예를 들면 HEVC(x265)나 H264(x264))은 CPU가, 하드웨어 인코딩(NVENC 계열)은 GPU가 담당

 


 

엔비디아 측에서는 하드웨어(GPU) 인코딩 시 해상도 변경(scaling)을 GPU 단계에서 할 수 있도록 하드웨어 필터인 NPP 필터 라이브러리를 제공하는데 이걸 FFmpeg에 포함시키기 위해서는 FFmpeg 바이너리를 컴파일하는 단계에서 해야 합니다. (--enable-libnpp) 샤나인코더는 이 기능을 제외했기 때문에 해상도 변경에 소프트웨어 필터(scale)를 사용해 CPU가 이 역할을 담당합니다.

 

따라서 Nvidia 계열 하드웨어 가속 관련해서 샤나에서는 두 가지 선택밖에 없습니다.

 

  1. [환경설정]에서 '하드웨어 가속 디코딩(DXVA2 또는 D3D11 또는 NVDEC)'을 선택
  2. NVENC 계열 코덱을 선택

 

엔비디아 그래픽 카드(NVENC가 가능한)가 따로 있다면 2번은 당연히 선택해야겠지요.

 

이 문제는 인텔 내장 그래픽 카드를 이용하려 할 때도 마찬가지입니다. 이때는 디코딩을 QSV로, 인코딩을 QSV 계열 코덱을 선택해야겠지요.

 

 

문제는 1번입니다.

 

요즘 나오는 CPU는 GPU를 내장하는 경우가 대부분이기 때문에 엔비디아 그래픽 카드가 따로 있다면 GPU가 두 개가 됩니다. CPU 내장 GPU(인텔의 경우 QSV가 가능한)를 GPU0, 그래픽 카드의 GPU를 GPU1이라고 한다면 가장 이상적인 상황은 1번을 선택할 때 GPU0이 디코딩을 담당해 GPU 간의 밸런스를 맞추는 것입니다. 그러나 문제는 샤나 내에서는 DXVA2/D3D11/NVDEC 옵션을 켜면 그걸 GPU1이 담당하게 된다는 겁니다. (그렇다고 해서 QSV를 선택하면 GPU0이 기능을 하느냐면, NVENC가 선택된 상황에서 QSV 하드웨어 가속 디코딩은 작동하지 않습니다.) 그래서 GPU1이 디코딩과 인코딩을 동시에 담당하여 작업 플로우는 GPU1 -> CPU -> GPU1으로 진행되는데, 대부분의 경우 병목 현상이 생겨 인코딩 성능이 저하되어 속도가 떨어집니다.

 

(이 현상은 다른 프로그램에서도 마찬가지로 발생합니다. FFmpeg CLI와 XMeida Recode를 통해서 확인했습니다.)

 

이때 CPU 점유율은 상당히 낮아집니다. 디코딩과 인코딩을 모두 GPU1이 담당하기 때문에 당연한 현상이겠지요.

 

결론적으로 말하자면, 하드웨어 가속 디코딩을 켜면 GPU1은 효율도 떨어지고 죽어나는데 CPU는 탱자탱자 놀게 됩니다. GPU0은 아예 모른 척하고요.

 

 

이 경우 하드웨어 가속 디코딩을 끄면 오히려 CPU가 디코딩을 담당하면서 CPU 점유율도 충분히 높아지고 더불어 GPU1의 인코딩 효율도 향상되어 속도가 올라가더군요. 물론 CPU의 성능이 충분히 괜찮고 이를 최대한 활용할 수 있어야 한다는 전제가 있긴 합니다.

 

 

----------------------------------------

 

 

속도 향상은 이렇게 해결하게 됐지만 의문은 남습니다.

 

"하드웨어 가속 디코딩을 GPU0이 담당하고 하드웨어 가속 인코딩은 GPU1이 담당하도록 할 수 없을까?"

 

이게 원래 불가능한 건지, 샤나 자체의 문제인지 제가 세팅을 못하는 건지 모르겠습니다. 저로서는 아무리 용을 써도 불가능하더군요.

혹시 이 문제에 대한 답을 알고 계시다면 댓글로 알려 주시면 감사하겠습니다. 그리고 그게 가능할 경우 속도 향상 효과가 있는지도 궁금하군요.

 

<- 이 문제에 대한 답변은 댓글로 추가했습니다.

이 글을 추천한 사람
로엔