TGMC CPU nicht voll ausgelastet

  • Mir ist aufgefallen, dass TGMC bei mir meist so 80-90% CPU Last hat. Doch leider kommt es auch immer wieder vor, dass die Last während des Encodings auf nur noch etwas mehr als 50% fällt. Damit wird die Encoding Geschwindigkeit natürlich total langsam. Mir ist auch aufgefallen, dass TGMC den gleichen Film von Anfang an mal mit 80-90% und auch mal mit 50% Last encodiert. Woran liegt das? Stimmt da was mit meinen Bibliotheken nicht?

    EDIT: Ich habe einen Dual Core Prozessor.

  • Tja, der Geist in der Maschine ...

    Schon mal die Speicherauslastung gecheckt, wenn der Effekt auftritt?
    Encoding eines einzelnen Files, oder Batch-Encoding?
    Sitzt VirtualDub mit im Boot?
    Falls x264: welcher Preset, bzw. welcher Wert für MBTree Lookahead?

  • Oh, stimmt. Hatte ja einiges an Infos vergessen.

    Also ich encode mit StaxRip (kein VirtualDub im Boot), x264 mit Preset Slower, Tune Film, Mode Quality. Im Moment ist es ist ein Bach Encode, aber das Phänomen tritt auch bei Einzelnen auf. Wie gesagt, Test an ein und dem gleichen File, und während dem Encode eines Files.

    Speicher liegt bei ca 1,94 GB von 2 GB. Hab auch schon versucht alles mögliche freizuschaufeln (1,3 GB dann), weil ich auch dachte es liegt daran, hat aber die Nacht über, der Encode dauert jetzt schon ein zwei Tage, nichts daran geändert.

    MBTree Lookahead konnt ich nicht finden. Nur einen RC Lookahead der bei 60 liegt. Ansonsten ist MB Tree aktiviert.

    EDIT: Gerade isser mal wieder bei 80-90%. Speicher 1,95 GB. Versteh ich nich.

    EDIT2:
    Die Konfiguration von TGMC verwende ich gerade:
    TempGaussMC_beta2(2,2,3,4,0,4,"EEDI2",eedi2maxd=16,truemotion=true,sharpness=1.75,Sbb=2,SLrad=2,SVthin=0.75,Sovs=2)

    2 Mal editiert, zuletzt von Menedas (29. Oktober 2010 um 19:58)

  • Ja, RC-Lookahead. Also, ich tippe mal schwer auf ein Speicherproblem. TGMC nimmt sich ja ganz ordentlich, und x264 auch. Und gerade der LookAhead kann bei komplexen Scripten schon mal zum Stolperstein werden. Bei lookahead=60 müssen ja (mindestens) 60 Output-Frames von Avisynth - also von TGMC - ständig im Speicher gehalten werden, während immer neue Frames berechnet werden.

    Was ist denn das Quellmaterial? SD 480i/576i, oder HD 1080i?

  • Tja, weiß auch nicht ... ich kenn' das Phänomen von Versuchen, 1080i->TGMC->x264 in einem Durchgang zu encoden. Mit 576i hatte ich das noch nicht...

    Tippe trotzdem auf ein Speicherproblem. Ist im Script ein SetMemoryMax() angegeben? Wenn ja, welcher Wert? Wird Avisynth-Multithreading verwendet? Ist die RAM-Ausstattung des Rechners 2GB, oder ist's mehr? Betriebssystem XP, Win7, oder noch was anderes?

  • Kein SetMemoryMax(). Was meinst du mit Avisynth-Multithreading? mt_masktools.dll werden verwendet, falls du das meinst. Ausstattung sind 2GB. WinXP 32-bit.

  • Das sollte Speichermäßig eigentlich reichen. Ich hatte gefragt, weil 2GB RAM unter Vista oder W7 etwas knapp sein könnten, um solch aufwändiges Encoding zu machen. Mit XP sollte das aber eigentlich reichen.

    Versuch mal mit SetMemoryMax(700) am Script-Anfang. Avisynth-Version ist 2.5.8, hoffentlich? Die Vorgänger 2.5.6 und 2.5.7 hatten so ihre Problemchen mit starker Speicherauslastung - 2.5.8 verhält sich da stabiler.

    Ansonsten - sorry, keine spezielle Idee. Wie gesagt, mit 1080i muss ich auch ordentlich Jonglieren, damit nichts ins Stolpern kommt ... aber mit normalen SD-Auflösungen klappt das immer problemlos.

  • "AviSynth-MultiThreading" (AviSynth-MT) ist eine spezielle Variante von AviSynth, die Video in mehreren Threads parallel auf mehreren Prozessoren/Kernen verarbeiten kann, wenn man's korrekt steuert.

    Das "mt" vorn an mt_masktools hat nichts direkt mit Multi-Threading zu tun.

  • Und in der Praxis bedeutet das sowas wie:

    720x576i -> TGMC(1,1,1,NNEDI2) -> x264 --slow

    "Normales" Avisynth: 5.5 fps

    "MT" Avisynth: 18.6 fps
    (avs->6 threads / x264-> 10 threads) (auf i7-860, 4Kerne+HT)


    Macht gute 4 Stunden für 1.5 Stunden Laufzeit des Eingangsmaterials. Dafür, dass die Geschwindigkeit von TGMC schon mit "Gletscherschmelze-Geschwindigkeit" verglichen wurde, dafür geht das doch eigentlich ganz in Ordnung.;)
    (SD geht also ganz gut. Aber bei HD gibt's lange Gesichter, das tut immer noch richtig weh...)

  • Hatte noch ein AviSynth 2.57. Werd das neue dann mal installieren wenn der Encode mal fertig wird. Oder vielleicht auch gleich, weil der schon wieder auf 50% gefallen is :/

    Hat SetMemoryMax(700) irgendwelche Auswirkungen auf die Encoding Qualität? Im Moment braucht x264 436 MB RAM und 476 MB Swap.

    MultiThreading is gut. Funktioniert das AviSynth-MT denn schon gut? Und wie muss man es noch steuern?

    EDIT: Ohje, ich bin schon froh, wenn ich über 1,8 fps habe. Wow das muss ich unbedingt haben :D

    Einfach mein TGMC Skript in MT() rein?

    EDIT2: Hm, wie ist das? Die modifizierte avisynth.dll version is jetzt noch 2.5.7.5. Aber du meintest doch, dass diese Version noch Speicherprobleme hatte.

    EDIT3:
    MT("TempGaussMC_beta2(2,2,3,4,0,4,"EEDI2",eedi2maxd=16,truemotion=true,sharpness=1.75,Sbb=2,SLrad=2,SVthin=0.75,Sovs=2)",threads=2)

    Bringt folgende Fehlermeldung:
    Avisynth open failure:
    Script error: expected a , or )

    CPUZ sagt, dass ich zwei Cores und zwei Threads habe. Heißt das ich habe insgesamt nur zwei Threads oder vier durch die zwei Cores?

    EDIT4:
    Ah mit
    MT("""TempGaussMC_beta2(2,2,3,4,0,4,"EEDI2",eedi2maxd=16,truemotion=true,sharpness=1.75,Sbb=2,SLrad=2,SVthin=0.75,Sovs=2)""",threads=2)
    scheint es jetzt zu gehen.

    5 Mal editiert, zuletzt von Menedas (29. Oktober 2010 um 23:00)

  • Die 476MB Swap sind's wohl, die das ganze in den Keller ziehen. Vermutlich ist durch anderweite Rechnernutzung der Gesamtbedarf an RAM zu stark angestiegen, XP hat Teile von der ganzen Encoding-Geschichte ausgelagert, und jetzt will's nimmer so recht in den Hauptspeicher zurückkommen.

    Auf die Qualität hat MemoryMax keinen Einfluss. Man kann damit nur die Cache-Größe von Avisynth etwas steuern. Bei 2GB Arbeitspeicher wird Avisynth per Default vrmtl. 384 bis 512 MB *) reservieren, je nachdem wie viel vom OS als "frei"/"verfügbar" gemeldet wird. Wenn man weiß dass man soviel gar nicht nicht braucht, dann setzt man weniger. Wenn man weiß dass man mehr braucht, dann setzt man mehr. Für Single-Threading reichen 512MB locker für den TGMC. Ebenfalls für MT(). Für SetMTmode() nehm' ich 1024 als Standard.

    *) IanB hat mal gesagt, dass sich Avisynth 2.5.6 um den SetMemoryMax Wert überhaupt nicht schert - es neigt dazu, allen nur verfügbaren RAM mit seinem Cache vollzuknallen. Wie's be i2.5.7 war weiß ich nicht, die Version hab ich nie benutzt. Aber, von 2.5.7 auf 2.5.8 ist an dem Cache-Managment nochmal ordentlich 'rumgedoktert worden - im Endeffekt ist 2.5.8 ein klein wenig langsamer als 2.5.7, aber (vermutlich) auch stabiler.


    Zum MultiThreading in Avisynth gibt's zwei Varianten: MT() und SetMTmode(). MT teilt jeden Frame in zwei oder mehrere Schnipsel ("Slices"), und jeder Slice wird von einem eigenen Thread bearbeitet. Im Gegensatz SetMTmode: hier bearbeitet jeder Thread einen vollständigen Frame.

    Zum Schmökern: Link 1, und Link 2.

    Vor/Nachteile MT():
    + braucht weniger Ressourcen
    + deswegen auch dort einsetzbar, wo SetMTmode zuviel Ressourcen brauchen würde
    - technisch nachteilig: z.B. kann MVTools keine Bewegung über die Slice-Grenzen hinweg verarbeiten
    - zur Vermeidung von Artefakten braucht man eine Überlappung der Slices. Um z.B. dem ^MVTools-Problem^ gegenzusteuern, braucht man viel Überlappung. Dadurch wächst die Gesamt-Bildfläche. Mehr Bildfläche -> langsamere Performance.
    - man kann auch leicht "modulo-Probleme" bekommen (wenn z.B. die Höhe oder Breite eines Slices nicht mehr durch 4 oder 8 oder 16 teilbar ist - je nachdem was der Filter erfordert)

    Vor/Nachteile SetMTmode():
    + technisch "reiner", weil die verschiedenen Nachteile des Slicings nicht auftreten
    + zumindest auf modernen i3/i5/i7: schneller als MT(). (Von älteren Dualcores habe ich schon das Gegenteil gehört.)
    - braucht mehr Ressourcen
    - funktioniert mit vielen, aber leider nicht mit allen Filtern

  • Hm, klingt jetzt bisschen danach, als würdest für TGMC von MT eher abraten.

    Und was das swappen angeht, habe ich noch nie erlebt dass das x264 nie tut. Egal wie viel Speicher noch frei ist.

  • Also es geht mit MT jetzt scheinbar einen ganzen Tick schneller. Nach ersten Tests ca. 2,1fps statt 1,6fps ohne MT (gleiche AviSynth Version), und auch die CPU Last bleibt jetzt scheinbar konstant auf über 90%. Aber dafür hängt sich StaxRip mit MT jetzt recht oft hin. Das is ziemlich blöde bei Batch Encodes.

    EDIT: Und danke für den Tipp mit der neueren Avisynth-MT Version.

    EDIT2: Was mir jetzt auch wieder auffällt ist, dass, seit ich TGMC verwende, öfter mal am Anfang des h264 Encodes erstmal für Minuten CPU Last (jetzt über 90% vorher nur 50%) produziert wird, ohne dass ein Encoding stattfindet. Zumindest steht die h264 Datei auf Größe 0 und auch im StaxRip Log Fenster steht keine Prozent Angabe. Was macht der da nur?

    EDIT3: Hm, nur was jetzt neu ist, dass der Speicherverbrauch konstant ansteigt :( Ich brechs mal ab. Hatte das Video vorhin schonmal angefangen zu encoden, da war das noch nicht. Habe ich auch schon öfter beobachtet. Dass es mal ist und mal nicht, bei dem gleichen Video.

    EDIT4: Habe das Video jetzt nochmal neugestartet, jetzt macht er was er soll.

    6 Mal editiert, zuletzt von Menedas (30. Oktober 2010 um 00:27)

  • Hm, also ich habe mal die Qualität von MT mit normalen Encodes verglichen. Mit MT habe ich so eine Art Horizontales Tearing. Das ist wohl das was Didée bereits vorausgesehen hat. Toll, damit ist MT für mich nicht zu gebrauchen :heul:

    EDIT: Ich habe jetzt auch mal SetMTMode in allen möglichen Modes ausprobiert auch SetMTMode(5,2), aber die CPU Last hängt immer irgendwo bei 80% rum. Nicht wie bei MT mit 98%. Damit dürfte es mir von der Geschwindigkeit her kaum etwas bringen :(

    2 Mal editiert, zuletzt von Menedas (30. Oktober 2010 um 08:37)

  • Mit MT habe ich so eine Art Horizontales Tearing. Das ist wohl das was Didée bereits vorausgesehen hat.


    Jo. Gegenrezept hatte ich auch geschrieben, aber das hast Du vermutlich nicht probiert?

    Zitat

    zur Vermeidung von Artefakten braucht man eine Überlappung der Slices. Um z.B. dem ^MVTools-Problem^ gegenzusteuern, braucht man viel Überlappung.

    Das wäre dann in etwa ...

    Code
    MT(""" TempGaussMC_beta2(.....) """, threads=2, overlap=16)

    Der "overlap" Wert macht's. Wenn die MVTools involviert sind, dann ist 1 x blocksize das empfohlene Minimum. 2 x blocksize ist besser / "sicherer" ... aber auch ein klein wenig langsamer.
    Bei den meisten anderen Filtern reichen 2 oder 4 Pixel overlap - es kommt eben darauf an, eine wie große "Umgebung" der Filter für das aktuelle Pixel berücksichtigt. Die meisten Filter haben eine kleine Umgebung (Blur/Rauschfilter, etc.) oder sogar gar keine Umgebung (reine temporal-Filter). Aber die MVTools machen halt Bewegungssuche, und die kann sich theoretisch auch über den halben Bildschirm erstrecken.

    Übrigens:

    Code
    ColorBars()MT(""" Subtitle("Hello World") """,threads=8)

    ;)


    Zitat von Menedas

    Ich habe jetzt auch mal SetMTMode in allen möglichen Modes ausprobiert auch SetMTMode(5,2), aber die CPU Last hängt immer irgendwo bei 80% rum. Nicht wie bei MT mit 98%. Damit dürfte es mir von der Geschwindigkeit her kaum etwas bringen :(


    Wie war/ist das Script denn aufgebaut? Die generelle Rohform sollte so aussehen:

    Code
    SetMTmode(5,<threads>)
    LoadPlugin(...)
    Import(...)
    xyzSource(...)
    SetMTmode(2)
    FILTER()


    Was mir jetzt erst aufgefallen ist: Mann-o-mann, Du hast aber auch alle Knöppe vom TGMC bis zum außersten Anschlag aufgedreht! Muss das wirklich alles sein?

    Und selbst wenn "ja":

    - Reduzierung von SLrad=2 zu SLrad=1 verringert die Komplexität schon mal etwas, ohne wirklich viel Unterschied zu machen
    - EEDI2 ist schon langsam. NNEDI2/3 könnten auf Multicores schneller sein - die verwenden "internes" Multi-Threading, und bieten auch Parameter für etwas schnellere Verarbeitung, insbesondere NNEDI3. Allerdings, dafür hat beta2 keine offiziellen Parameter - bis ich da (vielleicht) mal was mache, verweise ich auf die "QTGMC" Modifikation von -Vit-.

  • Oh, das Gegenrezept hab ich nur nicht richtig verstanden ;) Du meintest 4 Pixel Overlap reichen. Warum hast du dann jetzt 16 im Beispiel? 4x4? Und die Bildquali ist dadurch dann so gut wie als wenn man es ohne MT encoden würde? Also ich habs mal verglichen, es gibt zwar unterschiede, aber scheinbar keine qualitative Beeinträchtigung.

    Ah, man muss das SetMTmode noch vor dem LoadPlugin haben. Ich habs direkt vor den Filter. Ok. So nach einem Test, bekomme damit leider ziemlich oft:
    StaxRip has crashed!
    System.AccessViolationException: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.

    Also ich habs mal genau so probiert, also SetMTmode(5,2) in die erste Zeile des Skripts plus SetMTmode(2) oder nichts vor TGMC, habe dann aber immer nur eine Last von um 80%. Fehlen also fast 20%.

    Zu NNEDI2 hatte ich doch mal mit dir eine kleine Diskussion. In meinem Videobeispiel hatte das deutlich schlechtere Ergebnisse geliefert als EEDI2 ;)

    Ja, ich möchte schon die möglichst beste Qualität. Aber danke für den Tipp. Werde SLrad mal verringern und dann Quali-Test machen. Wäre wirklich schön, wenn das noch einen Tick schneller würde, ohne Qualitätsverlust. Muss ich nachher mal einen Geschwindigkeitstest unterziehen :)

  • Du meintest 4 Pixel Overlap reichen. Warum hast du dann jetzt 16 im Beispiel?


    2 oder 4 Pixel für einfache Kernel-Filter, oder ähnliches. In TGMC_beta2 wird MVTools mit einer blocksize von 16x16 verwendet. Deswegen 16 Pixel overlap.


    Zitat

    StaxRip has crashed!
    System.AccessViolationException: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben.


    Speicherfehler / SetMemoryMax.


    Zitat

    Also ich habs mal genau so probiert, also SetMTmode(5,2) in die erste Zeile des Skripts plus SetMTmode(2) oder nichts vor TGMC, habe dann aber immer nur eine Last von um 80%. Fehlen also fast 20%.


    Ich merke auch, dass MTmode mit 2 threads desöfteren nicht ganz so effektiv ist. Beste Werte bekomme ich meistens mit 4, 6 oder 8 Threads.
    Allerdings ja auch auf einem 4-Kerner mit insgesamt 8 logischen SMT Threads. Bei Dir - zwei Kerne mit insgesamt 2 logischen SMT Threads, da kann sich das schon anders verhalten. (Zu dieser CPU-Generation hab' ich kaum eigene Erfahrungswerte - ich hab' ja einen technischen Zehn-Jahres-Sprung von Celeron-1Core auf Nehalem-4CoreHT gemacht.)


    Zitat

    Zu NNEDI2 hatte ich doch mal mit dir eine kleine Diskussion. In meinem Videobeispiel hatte das deutlich schlechtere Ergebnisse geliefert als EEDI2


    Ja, ich weiß. Aber das sagt trotzdem nicht, dass EEDI2 "besser" wäre. Es ist nur "anders". EEDI2 ist insgesamt erfolgreicher beim "Verbinden" von fehlenden Bildinhalten. Aber: EEDI2 produziert auch eindeutig mehr Bildfehler (*falsche* Verbindungen, und Streu-Pixel). Die Gesamterscheinung ist weniger "natürlich". Und außerdem ist EEDI2 langsamer, deutlich langsamer als NNEDI2 oder NNEDI3.

    Du hast Dein Beispiel zu EEDI2 -vs- NNEDI2 gezeigt. Okay. Ich hab auch ein Beispiel.

    ------- Source --------------- EEDI2 --------------- NNEDI2
    [Blockierte Grafik: http://img831.imageshack.us/img831/8392/shimmertest1source.th.png][Blockierte Grafik: http://img178.imageshack.us/img178/6489/shimmertest2eedi2.th.png][Blockierte Grafik: http://img524.imageshack.us/img524/7398/shimmertest3nnedi2.th.png]

    [Blockierte Grafik: http://img215.imageshack.us/img215/9591/lotd1source.th.png][Blockierte Grafik: http://img594.imageshack.us/img594/3995/lotd2eedi2.th.png][Blockierte Grafik: http://img139.imageshack.us/img139/3048/lotd3nnedi2.th.png]

    Sollte wohl reichen als Beleg, dass EEDI keinesfalls "generell besser" ist als NNEDI ...


    Speed:

    EEDI2 ist immer single-threaded. NNEDI2 kann beliebig viele Threads verwenden.

    Reines Bobbing von 720x576i:

    EEDI2(maxd=16) : 6.3 fps

    NNEDI2(threads=1/2/4) : 9.6 / 17.0 / 27.0 fps


    Mit nur einem Thread ist NNEDI2 50% schneller als EEDI2. Mit 2 Threads ist's fast dreimal so schnell.
    Qualitätsmäßig ist also eher ein "you win here, you lose there" Spiel. Und geschwindigkeitsmäßig ist EEDI2 hoffnungslos unterlegen.

    Geschwindigkeit war doch das ursprüngliche Problem, oder?

    Du wirst wohl irgendeinen Kompromiss schließen müssen. Wenn alle Parameter auf Maximum aufgedreht sind, und von den möglichen Filter-Alternativen auch noch die langsamsten Varianten präferiert werden, dann ... sollte man sich nicht über unterirdische Geschwindigkeit beschweren. Als i-Tüpfelchen müsstest Du eigentlich noch x264 --preset placebo verwenden - dann passt alles zusammen. :D

    3 Mal editiert, zuletzt von Didée (30. Oktober 2010 um 13:38)

  • Hm, cooles preset. Das wär doch was für mich :D

    Aber hast schon recht. Und dein Beispiel fand ich auch überzeugend. Hatte ja selbst schon im anderen Fehler entdeckt. Werde ich mir nocheinmal ansehen und Geschwindigkeit testen. Auch nochmal von NNEDI3. Danke für den Tipp.

    EDIT: Meinst mit Speicherfehler, dass mein Arbeitsspeicher hin is? Müsst wohl mal nen memtest drüberlaufen lassen. Würde mich aber recht wundern.

    EDIT2: Was wolltest du mir eigentlich mit dem "Übrigens: ColorBars()" sagen? Ich komm einfach nich drauf :/ Dass es bei mir auch mit 8 Threads läuft?

    EDIT3: Also mit NNEDI2 hab ich volle CPU Last. Bringts da MT überhaupt noch?

    2 Mal editiert, zuletzt von Menedas (30. Oktober 2010 um 13:52)

Jetzt mitmachen!

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