Warum ist der Prozessor "besser" für die Codierung als die GPU?

12

Ich habe diesen Artikel gelesen und festgestellt, dass eine CPU für die Videokomprimierung besser ist als eine GPU.

Der Artikel sagt nur, dass dies passiert, weil der Prozessor komplexere Algorithmen handhaben kann als die GPU, aber ich möchte eine technische Erklärung, ich habe im Internet gesucht, aber ich habe nichts gefunden.

Weiß jemand, dass er eine Site erklären oder verlinken kann? Ich hatte eine tiefere Erklärung dafür.

Mateus Felipe Martins Da Costa
quelle

Antworten:

20

Der Artikel, den Sie verlinkt haben, ist nicht sehr gut.

Normalerweise konvertieren Single-Pass-Bitratencodierungen Ihre Bitrate in einen RF-Wert mit einem maximalen Bitratenlimit und nehmen ihn von dort auf.

Die einmalige ABR-Ratensteuerung von x264 ist nicht als CRF + -Limit implementiert. Er hat Recht, dass 2pass bei weitem der beste Weg ist, eine Ziel-Bitrate zu erreichen.

Und er merkt anscheinend nicht, dass er x264 mit Threads = 3 oder so beginnen könnte, um etwas CPU-Zeit für andere Aufgaben frei zu lassen. Oder setzen Sie die Priorität von x264 auf sehr niedrig, damit nur die CPU-Zeit zur Verfügung steht, die keine andere Aufgabe benötigt.

Er mischt auch Threads = 1 mit CUDA oder so. Kein Wunder, dass Sie Fragen haben, denn dieser Artikel hat eine SCHRECKLICHE Erklärung. Der gesamte Artikel besteht im Wesentlichen aus: Verwenden Sie x264 --preset veryslow --tune film --crf 26 in.m2ts --out out.mkvoder verwenden Sie möglicherweise eine Lichtfilterung mit einem AviSynth-Eingabeskript. Er empfiehlt tatsächlich "Placebo". Das ist komisch. Ich habe noch nie eine mit Placebo verschlüsselte Raubkopie gesehen. (Sie können von me=esaoder me=tesaanstelle me=umhaller guten Qualitätsvoreinstellungen bis zu unterscheiden veryslow.

Er erwähnt auch nicht die Verwendung von 10-Bit-Farbtiefe. Das Kodieren und Dekodieren ist langsamer, aber selbst nach der Rückkonvertierung auf 8-Bit erhalten Sie ein besseres 8-Bit-SSIM. Offenbar hilft es, wenn Bewegungsvektoren präziser sind. Es hilft auch, nicht auf genau einen 8-Bit-Wert abrunden zu müssen. Sie können sich 8-Bit pro Komponente als Speed-Hack vorstellen. Das Quantisieren im Frequenzbereich und das anschließende Komprimieren mit CABAC bedeutet, dass höhere Bittiefenkoeffizienten nicht mehr Platz benötigen.

(Übrigens profitiert h.265 weniger von 10-Bit-Codierungen für 8-Bit-Video, da es bereits eine höhere Präzision für Bewegungsvektoren aufweist. Wenn die Verwendung von 10-Bit x265 für 8-Bit-Videoeingänge einen Vorteil bietet, ist sie kleiner als mit x264. Es ist also weniger wahrscheinlich, dass sich die Geschwindigkeitsstrafe lohnt.)

So beantworten Sie Ihre eigentliche Frage:

edit: doom9 ist jetzt wieder online, also räume ich den link auf. Sehen Sie sich an, wer was gesagt hat.

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

google speichert nur die blöde druckversion zwischen, die das zitat nicht richtig anzeigt. Ich bin nicht ganz sicher, welche Teile dieser Nachrichten Zitate sind und welche der Person selbst zugeschrieben werden.

Stark unregelmäßige Verzweigungsmuster (Sprungmodi) und Bit-Manipulation (Quantisierung / Entropie-Codierung) passen nicht zu aktuellen GPUs. IMO ist die einzige wirklich gute Anwendung im Moment die vollständige Suche nach ME-Algorithmen, obwohl die beschleunigte vollständige Suche immer noch langsam ist, selbst wenn sie schneller als die CPU ist.
- MfA

Eigentlich kann im Grunde alles vernünftigerweise auf der GPU erledigt werden, mit Ausnahme von CABAC (was getan werden könnte, es könnte einfach nicht parallelisiert werden).

x264 CUDA implementiert zunächst einen Fullpel- und einen Subpel-ME-Algorithmus. später könnten wir so etwas wie RDO mit einer Bit-Cost-Approximation anstelle von CABAC machen.

Weil es alles mit Gleitkommazahlen mit einer Genauigkeit zu tun hat
- MfA

Falsch, CUDA unterstützt ganzzahlige Mathematik.

- Dunkler Shikari

Dark Shikari ist der x264-Betreuer und Entwickler der meisten Funktionen seit etwa 2007.

AFAIK, dieses CUDA-Projekt ist nicht aufgegangen. Es gibt Unterstützung für die Verwendung von OpenCL, um einige Arbeiten aus dem Lookahead-Thread zu entfernen (schnelle I / P / B-Entscheidung, keine hochqualitative endgültige Kodierung des Frames).


Ich verstehe, dass der Suchraum für die Videokodierung so groß ist, dass intelligente Heuristiken für die vorzeitige Beendigung von Suchpfaden auf CPUs die Brute-Force-GPUs übertreffen, zumindest für eine qualitativ hochwertige Kodierung. Es ist nur im Vergleich zu dem, -preset ultrafastwo Sie vernünftigerweise HW-Codierung über x264 wählen könnten, esp. Wenn Sie eine langsame CPU haben (wie ein Laptop mit Dual Core und ohne Hyperthreading). Auf einer schnellen CPU (i7 Quad Core mit Hyperthreading) wird x264 superfastwahrscheinlich genauso schnell sein und besser aussehen (bei gleicher Bitrate).

Wenn Sie eine Codierung erstellen, bei der es auf Ratenverzerrung (Qualität pro Dateigröße) ankommt, sollten Sie x264 -preset mediumoder langsamer verwenden. Wenn Sie etwas archivieren, sparen Sie durch etwas mehr CPU-Zeit Byte, solange Sie diese Datei behalten.

Nebenbei bemerkt, wenn Sie jemals Nachrichten von Toten in einem Videoforum sehen, wird dies nicht hilfreich sein. Er hat sich bei den meisten Dingen geirrt, über die er in jedem Thread gesprochen hat, den ich je gesehen habe. Seine Posts tauchten in ein paar Threads auf, die ich über die x264-GPU-Codierung gegoogelt habe. Anscheinend versteht er nicht, warum es nicht einfach ist, und hat einige Male geschrieben, um den x264-Entwicklern zu sagen, warum sie dumm sind ...

Peter Cordes
quelle
9

Update 2017:

ffmpeg unterstützt die GPU-beschleunigte Videokodierung mit h264 und h265 NVENC . Sie können entweder für hevc_nvenc oder h264_nvenc 1-Pass- oder 2-Pass-Codierung in der von Ihnen gewählten Qualität durchführen. Selbst mit einer Einstiegs-GPU ist dies viel schneller als nicht beschleunigte Codierung und Intel Quick Sync-beschleunigte Codierung.

Hochwertige 2-Pass-Codierung:

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

Standardcodierung in einem Durchgang:

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

NVENC ffmpeg Hilfe und Optionen:

ffmpeg -h encoder=nvenc

Verwenden Sie es, es ist viel schneller als die CPU-Codierung.

Wenn Sie keine GPU haben, können Sie den Intel Quick Sync-Codec h264_qsv, hevc_qsv oder mpeg2_qsv verwenden, die ebenfalls viel schneller sind als nicht beschleunigte Codierung.

Jack
quelle
3
Verwenden Sie diese Option, wenn Sie Wert auf Geschwindigkeit (und niedrige CPU-Auslastung) und Qualität pro Dateigröße legen. In einigen Anwendungsfällen, z. B. beim Streaming zum Zucken, ist dies das, was Sie möchten (insbesondere die niedrige CPU-Auslastung). In anderen Fällen, z. B. wenn Sie einmal codieren, um eine Datei zu erstellen, die viele Male gestreamt / angesehen wird, werden Sie sie immer noch nicht schlagen -c:v libx264 -preset slower(was nicht so langsam ist, wie in Echtzeit für 1920 x 1080p24 auf einem Skylake i7-6700k.)
Peter Cordes
Die Verwendung von ffmpegmit -vcodec h264_qsvauf meinem alten Intel-Notebook mit einem Intel HD Grpahics 4000 machte das Rendern viel schneller!
Tony
2

Um ein wenig näher auf das einzugehen, was Peter sagt, hilft es im Allgemeinen, mehrere Prozessoren zu verwenden, wenn Sie mehrere unabhängige Aufgaben haben, die alle erledigt werden müssen, aber keine Abhängigkeiten voneinander haben, oder eine Aufgabe, bei der Sie dasselbe tun Mathe auf riesige Datenmengen.

Wenn Sie jedoch die Ausgabe von Berechnung A als Eingabe von Berechnung B und die Ausgabe von Berechnung B als Eingabe von Berechnung C benötigen, können Sie dies nicht beschleunigen, indem Sie für jede Aufgabe einen anderen Kern bearbeiten ( A, B oder C) weil man nicht anfangen kann, bis der andere fertig ist.

Selbst in dem obigen Fall können Sie es möglicherweise auf eine andere Weise parallelisieren. Wenn Sie Ihre Eingabedaten in Blöcke aufteilen können, haben Sie möglicherweise einen Kern, der A, dann B, dann C mit einem Datenblock bearbeitet, während ein anderer Kern A, dann B und dann C mit einem anderen Datenblock bearbeitet .

Es gibt auch andere Überlegungen. Vielleicht finden Sie eine Möglichkeit, die Berechnungen zu parallelisieren, aber das Lesen der Daten von der Festplatte oder über das Netzwerk oder das Senden an die GPU dauert länger als das Ausführen der Berechnungen. In diesem Fall ist eine Parallelisierung nicht sinnvoll, da das Speichern der Daten länger dauert als die Zeit, die Sie durch die parallele Berechnung sparen.

Mit anderen Worten, es ist ebenso eine Kunst wie eine Wissenschaft.

user1118321
quelle
Oh ja, x264 lässt sich auf Multicore-CPUs recht gut parallelisieren. Ich skaliere fast linear auf mindestens 8 Kerne und sogar über 32 hinaus. Die Bewegungsschätzung kann parallel durchgeführt werden, sodass nur die notwendigerweise serielle Arbeit für einen anderen Thread und ähnliche Tricks übrig bleibt.
Peter Cordes
Die Frage ist nicht Parallelität im Allgemeinen, sondern GPUs im Besonderen. Sie sind im Code viel restriktiver als CPUs. Ich denke, es liegt daran, dass Sie keinen Code mit Zweigen haben können, die in verschiedenen Blöcken des Bildes unterschiedliche Wege gehen. Ich verstehe nicht genau warum, aber ich denke es ist so ähnlich. Jeder Stream-Prozessor ist so einfach und mit so begrenzten Möglichkeiten, ihn unabhängig von den anderen laufen zu lassen, dass Sie entweder immer auf den langsamsten warten müssen, oder Sie sind in der Verzweigung eingeschränkt, oder beides.
Peter Cordes
Wenn Sie einen Cluster von Computern hätten (CPUs mit unabhängigem RAM, die nicht miteinander um Speicherbandbreite und CPU-Cache konkurrieren), würden Sie Ihr Eingabevideo in GOPs aufteilen und Abschnitte des noch komprimierten Eingabevideos senden, um zu sein auf anderen Computern im Cluster dekodiert und komprimiert. Es müsste also nur komprimiertes Eingangs- oder Ausgangsvideo übertragen werden. Bei einem Multicore-Shared-Cache / RAM-System wie einer x86-Workstation mit mehreren Sockeln können mehrere Threads gleichzeitig auf denselben Frames ausgeführt werden. (bedeutet auch, dass Sie keinen neuen Code benötigen, um die globale Geschwindigkeitskontrolle für die Segmentierung von Codierungen durchzuführen.)
Peter Cordes