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.