x264 output = f(CPU-Type, core/thread count)?

  • Hi,

    ich muss sagen dass ich doch etwas etwas überrascht war dass ein-und-der-selbe Film unterschiedlich groß wird, je nachdem ob ich auf einem AMD Opteron oder einem Intel Core 2 encoded (AMD größer).

    Ich hätte da ja ggf. an "Rundungsfehler" bei verschiedenen CPUs gedacht, aber selbst auf dem Core 2 macht es einen Unterschied ob ich multi-threaded arbeite oder nicht...

    Ich habe mal gehört dass multi-threaded encoding etwas schlechtere Qualität haben soll. Läuft die Analyse multi-threaded nicht optimal, so dass es deswegen zu Unterschieden kommt?

    Je mehr cores/threads desto größer. Opteron immer größer Core 2.
    Core 2 (Duo), --threads 1 => 16.0 MB, bei multi-thread = 16,2 MB.
    Opteron (2xDuo) => 16,3 zu 16,7 MB.

    Auf dem Opteron entstehen nur 0,7% 5er consecutive B-frames, auf dem Core 2 1,1%.

    Getestet mit

    Code
    x264.exe --crf 21 --preset slow --tune film --bframes 5 --subme 10 --trellis 2 --sar 16:11

    Core 2: x264 [info]: using cpu capabilities: MMX2 SSE2Fast SSSE3 Cache64
    Opteron: x264 [info]: using cpu capabilities: MMX2 SSE2Slow

    Last but not least: Auch die autocrop detection unterscheidet sich:
    Core 2 = Crop(8,14,-8,-18), Opteron = Crop(10,14,-6,-18). Und das obwohl das D2V File gleich ist!

    Merkwürdig...

  • Von der Anzahl der Threads hängt es mit Sicherheit ab. Schließlich bekommt jeder der n Threads nur 1/n des Filmes zu sehen. (Ich kann nur jetzt nicht mit Sicherheit sagen, was exakt.) Dass es jedoch bis zur Cropping-Analyse reicht, ist tatsächlich überraschend.

  • Zur maximal erreichbaren Qualität kann ich nichts sicher sagen; wenn die Bitrate nicht beschränkt wird, dann kann der Encoder immer noch Teile des Bildes, für die keine hinreichend ähnliche Referenz gefunden wird, intra-codiert (also unabhängig) speichern, was halt mehr Platz braucht, aber ebenso die Qualität sichert. Relativ sicher ist lediglich, dass mit dem Geschwindigkeitsvorteil ein gewisser Nachteil im Verhältnis zwischen Größe und Qualität entsteht. Der kann jedoch durchaus unmerklich klein ausfallen.

  • Das führt jetzt ggf. zu weit, aber - weiß jemand wie die frames auf die threads aufgeteilt werden?
    z.B. immer abwechselnd (wohl kaum, wäre wohl der worst case), oder jeder thread bekommt immer eine Sequenz von 10 oder 100 frames?

    Nur falls es zufällig jemand weiß.... :)

  • Das führt jetzt ggf. zu weit, aber - weiß jemand wie die frames auf die threads aufgeteilt werden?
    z.B. immer abwechselnd (wohl kaum, wäre wohl der worst case), oder jeder thread bekommt immer eine Sequenz von 10 oder 100 frames?

    Nur falls es zufällig jemand weiß.... :)

    In x264 ist das Multi-Threading Frame-basiert, d.h. für jeden zu verarbeitenden Frame wird genau ein Thread gestartet, der sich auch nur um diesen Frame kümmert. Die maximale Anzahl von parallel laufenden Encoder-Threads ist durch "--threads" festgelegt oder wird standardmäßig auf 3/2 * #Prozessorkerne gesetzt. Die Frames werden aber keinesfalls unabhängig voneinander verarbeitet! Jeder Frame/Thread muss ja auf seine benachbarten Referenzframes zugreifen. Dabei ist sicherzustellen, dass ein Thread nur auf Bereiche eines anderen Threads/Frames zugreift, die bereits fertig gestellt sind. x264 garantiert jedem Thread dabei einen minimale "Breite" (es wird ja in Markroblock-Zeilen von oben nach unten gearbeitet), die im Referenz-Frame auf jeden Fall fertig/zugreifbar ist. Solange x264 im deterministischen Modus arbeitet (das ist der Standard!), beschränkt sich ein Thread sogar bei der Bewegungssuche im Referenz-Frame immer auf den minimal zugesicherten Bereich (anstatt einfach alles zu benutzen, was schon fertig ist). Genau diese Einschränkung bei der Bewegungssuche ist dafür verantwortlich, dass die Kompressionseffizienz mit steigender Anzahl von Threads leidet, d.h. die Datei wird bei gleicher Qualität größer oder die Qualität bei gleicher Größe schlechter. Allerdings sind die Unterschiede bei der Anzahl von Threads, die in der Praxis vorkommt, so klein, dass man sich da keine Sorgen machen muss. Die aller meisten Bewegungen sind ohnehin in horizontaler Richtung, so dass die Einschränkung der Suche in vertikaler Richtung kaum ins Gewicht fällt. Und auf jeden Fall leidet die Kompressionseffizienz bei diesem Ansatz weitaus weniger, als das bei Slice-basiertem Multi-Threading der Fall wäre. x264 unterstützt jetzt zwar auch wieder Slices (d.h. ein Frame wird in mehrere Stücke unterteilt), diese werden aber nicht zum Multi-Threading verwendet.

    Ein paar Zahlen, die aber nicht mehr aktuell sein müssen:

    Siehe auch:

    Zitat

    int i_mv_range_thread; /* minimum space between threads. -1 = auto, based on number of threads. */

    Zitat

    int b_deterministic; /* whether to allow non-deterministic optimizations when threaded */

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!