GPU보다 인코딩에 프로세서가 더 나은 이유는 무엇입니까?


13

이 기사를 읽고 CPU가 비디오 압축에 GPU보다 낫다는 것을 알았습니다.

이 기사는 프로세서가 GPU보다 복잡한 알고리즘을 처리 할 수 ​​있기 때문에 발생한다고 기술하지만 더 기술적 인 설명을 원합니다. 인터넷에서 검색을했지만 아무것도 찾지 못했습니다.

그래서 누군가 내가 사이트에 대해 설명하거나 링크를 알고 있다는 것을 알고 있습니까?

답변:


21

연결 한 기사가 그리 좋지 않습니다.

일반적으로 단일 패스 비트 전송률 인코딩은 비트 전송률을 최대 비트 전송률 제한이있는 RF 값으로 변환하여 가져옵니다.

x264의 1 패스 ABR 속도 제어는 CRF + 한계로 구현되지 않습니다. 그래도 2 패스가 대상 비트 전송률을 달성하는 가장 좋은 방법이라는 것은 맞습니다.

그리고 그는 다른 작업을 위해 CPU 시간을 자유롭게 남겨두기 위해 스레드 = 3 또는 다른 것으로 x264를 시작할 수 있음을 알지 못합니다. 또는 x264의 우선 순위를 매우 낮게 설정하면 다른 작업에서 원하지 않는 CPU 시간 만 가져옵니다.

또한 CUDA 또는 다른 것을 사용하여 스레드 = 1을 섞습니다. 기사에 끔찍한 설명이 있기 때문에 궁금한 점이 없습니다. 전체 기사는 기본적으로 use x264 --preset veryslow --tune film --crf 26 in.m2ts --out out.mkv, 또는 입력 AviSynth 스크립트로 일부 라이트 필터링을 사용합니다. 그는 실제로 "위약"을 추천합니다. 재밌 네요. 위약으로 인코딩 된 불법 복제 된 파일을 본 적이 없습니다. ( 모든 양질의 사전 설정 대신 me=esa또는 에서 (으)로 알 수 있습니다 .me=tesame=umhveryslow

또한 10 비트 색심도 사용에 대해서는 언급하지 않았습니다. 인코딩 및 디코딩 속도가 느리지 만 다시 8 비트로 다시 변환 한 후에도 8 비트 SSIM이 향상됩니다. 모션 벡터의 정밀도를 높이면 분명히 도움이됩니다. 또한 정확히 8 비트 값으로 반올림하지 않아도 도움이됩니다. 구성 요소 당 8 비트를 속도 핵으로 생각할 수 있습니다. 주파수 영역에서 양자화 한 다음 CABAC로 압축한다는 것은 높은 비트 깊이 계수가 더 많은 공간을 차지할 필요가 없다는 것을 의미합니다.

(BTW, h.265는 모션 벡터에 대해 이미 정밀도가 높기 때문에 8 비트 비디오에 대한 10 비트 인코딩의 이점이 적습니다. 8 비트 비디오 입력에 10 비트 x265를 사용하는 이점이있는 경우 따라서 속도 패널티가 그만한 가치가 없을 것입니다.)

실제 질문에 대답하려면 :

편집 : 이제 doom9가 다시 시작되었으므로 링크를 정리하겠습니다. 누가 무엇을 말했는지에 대한 적절한 인용을 위해 그것에 가십시오.

http://forum.doom9.org/showthread.php?p=1135399#post1135399

Google은 따옴표를 제대로 표시하지 않는 바보 같은 인쇄 버전 만 캐시합니다. 나는이 메시지들 중 어떤 부분이 인용문인지, 그리고 그 자체가 인용 된 것인지 확실하지 않습니다.

매우 불규칙적 인 분기 패턴 (건너 뛰기 모드) 및 비트 조작 (양자화 / 엔트로피 코딩)은 현재 GPU에 적합하지 않습니다. IMO가 현재 유일하게 좋은 응용 프로그램은 전체 검색 ME 알고리즘입니다. 결국 전체 검색 속도는 CPU보다 빠르더라도 여전히 느립니다.
-MfA

실제로 기본적으로 CABAC를 제외하고 GPU에서 모든 것을 합리적으로 수행 할 수 있습니다 (수행 할 수는 있지만 병렬화 할 수는 없습니다).

x264 CUDA는 처음에 fullpel 및 subpel ME 알고리즘을 구현합니다. 나중에 CABAC 대신 비트 비용 근사치로 RDO와 같은 작업을 수행 할 수 있습니다.

단 정밀도 부동 소수점에서 모든 작업을 수행해야하기 때문에
-MfA

잘못된 CUDA는 정수 수학을 지원합니다.

-다크 시카 리

Dark Shikari는 x264 관리자이자 2007 년 이후 대부분의 기능을 개발 한 개발자입니다.

AFAIK,이 CUDA 프로젝트는 전개되지 않았습니다. 룩어 헤드 스레드에서 일부 작업을 오프로드하기 위해 OpenCL을 사용할 수 있습니다 (프레임의 고품질 최종 인코딩이 아닌 빠른 I / P / B 결정).


나의 이해는 비디오 인코딩을위한 검색 공간은 CPU에서 검색 경로의 조기 종료에 대한 스마트 추론이 무차별 GPU는 높은 품질의 인코딩 적어도, 테이블에 가져다 이길 수 있도록 큰 것입니다. -preset ultrafastx264보다 HW 인코딩을 합리적으로 선택할 수있는 곳 과 비교됩니다 . CPU가 느린 경우 (듀얼 코어가 있고 하이퍼 스레딩이없는 랩톱과 같은) 빠른 CPU (하이퍼 스레딩 기능이있는 i7 쿼드 코어)에서 x264 superfast는 속도가 빠를 것입니다 (같은 비트 전송률에서).

전송률 왜곡 (파일 크기 당 품질)이 중요한 인코딩을 만드는 경우 x264 -preset medium이하 를 사용해야합니다 . 무언가를 보관하는 경우 이제 조금 더 많은 CPU 시간을 소비하면 해당 파일을 유지하는 한 바이트를 절약 할 수 있습니다.

참고로, 비디오 포럼에 교착 상태 메시지가 표시되면 도움이되지 않습니다. 그는 내가 본 모든 실에서 그가 말하고있는 대부분의 것들에 대해 틀렸다. 그의 게시물은 x264 GPU 인코딩에 대해 Google에서 검색 한 몇 개의 스레드로 나타났습니다. 분명히 그는 왜 쉽지 않은지 이해하지 못하고 x264 개발자에게 왜 바보인지 왜 알기 위해 여러 번 게시했습니다 ...


9

2017 년 업데이트 :

ffmpeg는 h264 및 h265 NVENC GPU 가속 비디오 인코딩을 지원 합니다. hevc_nvenc 또는 h264_nvenc에 대해 선택한 품질로 1 패스 또는 2 패스 인코딩을 수행 할 수 있으며 엔트리 레벨 GPU의 경우에도 가속되지 않은 인코딩 및 인텔 빠른 동기화 가속 인코딩보다 훨씬 빠릅니다.

2- 패스 고품질 인코딩 :

ffmpeg -i in.mp4 -vcodec h264_nvenc -preset slow out.mp4

1 패스 기본 인코딩 :

ffmpeg -i in.mp4 -vcodec h264_nvenc out.mp4

NVENC ffmpeg 도움말 및 옵션 :

ffmpeg -h encoder=nvenc

이것을 사용하면 CPU 인코딩보다 훨씬 빠릅니다.

GPU가없는 경우 Intel Quick Sync 코덱, h264_qsv, hevc_qsv 또는 mpeg2_qsv를 사용할 수 있으며 이는 가속되지 않은 인코딩보다 훨씬 빠릅니다.


3
파일 크기 당 품질보다 속도 (및 CPU 사용량이 낮음)를 중요하게 생각 하면 사용하십시오 . 트 위치로 스트리밍과 같은 일부 유스 케이스의 경우 원하는 것 (특히 CPU 사용량이 낮음)입니다. 다른 경우, 예를 들어 한 번 인코딩하여 여러 번 스트리밍 / 보는 파일을 만들더라도 여전히 이길 -c:v libx264 -preset slower수는 없습니다 (Skylake i7-6700k에서 1920x1080p24의 거의 실시간과 같이 느리지는 않습니다)
— Peter Cordes

사용 ffmpeg과 -vcodec h264_qsv인텔 HD Grpahics 4000 내 오래된 인텔 노트북은 훨씬 빠르게 렌더링했다!
— Tony

2

Peter의 말에 대해 좀 더 자세히 설명하기 위해 일반적으로 여러 프로세서를 사용하면 모두 수행해야하지만 서로 의존하지 않는 여러 독립적 인 작업이 있거나 동일한 작업을 수행하는 하나의 작업이있는 경우 도움이됩니다. 방대한 양의 데이터에 대한 수학.

그러나 계산 A의 입력으로 계산 A의 출력과 계산 C의 입력으로 계산 B의 출력이 필요한 경우 각 작업에서 다른 핵심 작업을 수행하여 속도를 높일 수 없습니다 ( 다른 하나가 끝날 때까지 시작할 수 없기 때문에 A, B 또는 C).

그러나 위의 경우에도 다른 방법으로 병렬화 할 수 있습니다. 입력 데이터를 청크로 나눌 수 있다면 A, B, C를 하나의 데이터 청크로 수행하는 핵심 작업이 있고 다른 코어는 A, B, C를 다른 데이터 청크로 수행하는 작업을 수행 할 수 있습니다. .

다른 고려 사항도 있습니다. 계산을 병렬화하는 방법을 찾을 수는 있지만 디스크 나 네트워크를 통해 데이터를 읽거나 GPU로 전송하는 것은 계산을 수행하는 것보다 시간이 오래 걸립니다. 이 경우 병렬로 계산을 수행하여 데이터를 메모리에 저장하는 것보다 시간이 오래 걸리기 때문에 병렬화하는 것은 의미가 없습니다.

다시 말해, 그것은 과학만큼이나 예술입니다.


그렇습니다. x264는 멀티 코어 CPU에서 상당히 잘 병렬화됩니다. 나는 거의 8 코어까지, 거의 32 코어를 초과하여 선형 적으로 확장합니다. 모션 추정은 병렬로 수행 될 수 있으며, 다른 스레드에 대한 직렬 작업과 유사한 트릭 만 남길 수 있습니다.
— Peter Cordes

문제는 일반적으로 병렬 처리가 아니라 특히 GPU입니다. CPU보다 실행할 수있는 코드가 훨씬 제한적입니다. 이미지의 다른 블록에서 다른 방식으로 진행되는 분기가있는 코드를 가질 수 없기 때문이라고 생각합니다. 나는 왜 그런지 정확히 이해하지 못하지만, 나는 그것이 그런 것이라고 생각합니다. 각 스트림 프로세서는 매우 단순하며 다른 방법과 독립적으로 실행할 수있는 제한된 수단을 사용하므로 항상 가장 느린 프로세서가 완료 될 때까지 기다려야하거나 전혀 분기하지 못하거나 둘 다가 제한됩니다.
— Peter Cordes

컴퓨터 클러스터 (메모리 대역폭 및 CPU 캐시를 위해 서로 경쟁하지 않는 독립 RAM이있는 CPU)가있는 경우 입력 비디오를 GOP로 나누고 여전히 압축 된 입력 비디오의 섹션을 클러스터의 다른 시스템에서 디코딩 및 압축됩니다. 따라서 압축 된 입력 또는 출력 비디오 만 전송해야합니다. 멀티 소켓 x86 워크 스테이션과 같은 멀티 코어 공유 캐시 / RAM 시스템 중 하나 인 동시에 여러 개의 스레드가 동일한 프레임에서 동시에 작동합니다. (또한 분할 인코딩을 위해 전역 속도 제어를 수행하기 위해 새로운 코드가 필요하지 않음을 의미합니다.)
— Peter Cordes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.