Grund zu verwenden, um benutzerdefinierte allocator in 3rd-Party-Filter zu verwenden:Force-3rd-Party-Directshow-Filter, um benutzerdefinierte allocator
ich ein NUMA-System haben, und mit Filter-Speicher auf den falschen NUMA-Knoten führt zu Leistungsproblem Aufteilung und Abwurf Bilder von der Kamera empfangen.
Mein aktueller Ansatz:
Ich werde schrieb eine Funktion, die alle Filter durchläuft und sie bitten, wenn ihre Eingangsstift eine allocator hat. Dann frage ich diesen Zuordner für meine spezielle Zuweisungsschnittstelle und schließlich, wenn die Schnittstelle nicht gefunden wird, erzeuge ich einen neuen benutzerdefinierten Zuordner und wende dieselben Eigenschaften an wie der vorherige Zuordner. Dann rufe ich auf dem Eingangspin an, um es über den neuen Zuordner zu informieren.
Ich habe versucht, diese Funktion zu verschiedenen Zeiten im Graphenaufbau aufzurufen; derzeit nach IMediaControl::Pause
und direkt vor , aber mein benutzerdefinierter Zuordner wird von keinem Drittanbieterfilter verwendet. Die Beispiele befinden sich auf dem falschen NUMA-Knoten.
Zusätzlich verfolge ich auch die Threads, die während des Aufrufs IMediaControl::Pause
erstellt wurden und ändere ihre Thread-Affinität zur richtigen CPU. Normalerweise sollten diese DirectShow-Filter den richtigen NUMA-Knoten haben, wie sie auf dem NUMA-Knoten ihrer laufenden CPU reservieren sollten.
Ich habe das vermutet, aber wie kann sichergestellt werden, dass die Proben auf dem gleichen NUMA-Knoten sind? Die Zuweisungsschnittstellen oder die 'ALLOC_PROPERTIES' haben keine Optionen, um diese Art von Eigenschaft sicherzustellen. Vielleicht sollte ich mich mehr auf die Threading-Affinität konzentrieren, aber das ist keine 100% funktionierende Lösung –
Ich bin nicht sicher, ob Sie das überhaupt mit bereits eingebauten Filtern, die nichts über NUMA wissen, zuverlässig erreichen können. Sie sollten mehr Optionen haben, die Sie tun, einen benutzerdefinierten Filter - Sie wählen natürlich den Zuordner dann haben Sie auch die Kontrolle über Threads, die Sie erstellen und Threads, die Sie weiter streamen. –
Der 3rd-Party-Filter, über den wir sprechen, ist in diesem Fall ein Videokompressionsfilter. Der ursprüngliche Plan bestand also darin, den Benutzer aus installierten Komprimierungsfiltern auswählen zu lassen, anstatt einen benutzerdefinierten Komprimierungsfilter zu erstellen. Die einzige andere Lösung, die ich mir vorstellen kann, ist die Verarbeitung im Videospeicher. Aber ich müsste alles in MFT neu schreiben, wenn ich mich richtig erinnere. –