Frage

Ich arbeite gerade an einem Video-Codec für OMAP3430. Ich habe bereits Code in C ++ geschrieben, und ich versuche / Port zu ändern, um bestimmte Teile davon Vorteil des DSP zu nehmen (das SDK (OMAP ZOOM3430 SDK) Ich habe einen zusätzlichen DSP).

Ich habe versucht, in den Hafen ein kleines for-Schleife, die über eine sehr geringe Menge an Daten (~ 250 Bytes) ausgeführt wird, aber etwa 2 M mal auf verschiedenen Daten. Aber die Überlastung der Kommunikation zwischen CPU und DSP ist viel mehr als der Gewinn (wenn ich welche haben).

Ich gehe davon aus dieser Aufgabe ist ähnlich wie ein Code für die GPU in normalen Computern zu optimieren. Meine Frage ist die Portierung, welche Art von Teilen von Vorteil wäre? Wie nehmen GPU Programmierer kümmern solche Aufgaben?

edit:

  1. GPP Anwendung reserviert einen Puffer der Größe 0x1000 Bytes.
  2. GPP Anwendung ruft DSPProcessor_ReserveMemory einen DSP virtuellen Adressraum für jeden zugewiesenen Puffer reservieren mit einer Größe verwenden, die 4K größer ist als die zugewiesenen Puffer ist für die automatische Seitenausrichtung zu berücksichtigen. Die gesamte Buchungsgröße muss auch entlang einer 4K Seiten-Grenze ausgerichtet werden.
  3. GPP Anwendung ruft DSPProcessor_Map jeweils zugewiesenen Puffer zu den DSP virtuellen Adressräume im vorherigen Schritt reserviert abzubilden.
  4. bereitet GPP-Anwendung eine Meldung der DSP ausführen Phase der Basisadresse des virtuellen Adressraums zu informieren, die mit einem Puffer auf dem GPP zugeordnet kartiert wurden. GPP-Anwendung verwendet DSPNode_PutMessage die Nachricht an den DSP zu senden.
  5. GPP ruft Memcpy die Daten zu kopieren, in dem gemeinsam genutzten Speicher verarbeitet werden.
  6. GPP Anwendung ruft DSPProcessor_FlushMemory, um sicherzustellen, dass die Daten-Cache geleert wurde.
  7. bereitet GPP-Anwendung eine Meldung der DSP Ausführungsphase zu benachrichtigen, dass er fertig ist mit dem Puffer zu schreiben und der DSP kann jetzt auf den Puffer zugreifen. Die Nachricht enthält auch die Datenmenge in den Puffer geschrieben, so dass der DSP wissen, wie viele Daten zu kopieren. Die GPP verwendet DSPNode_PutMessage die Nachricht an den DSP zu senden und ruft dann DSPNode_GetMessage zu warten, um eine Nachricht zurück von dem DSP zu hören.

Nachdem diese die Ausführung von DSP-Programm startet, und DSP benachrichtigt den GPP mit einer Meldung, wenn es um die Verarbeitung beendet. Nur um zu versuchen, ich innerhalb des DSP-Programm eine Verarbeitung nicht setzen. Ich senden Sie einfach eine „Verarbeitung beendet“ Nachricht an den GPP zurück. Und das verbraucht noch viel Zeit. Könnte sein, dass aufgrund der internen / externen Speichernutzung sein, oder ist es nur wegen der Kommunikationsüberlastung?

War es hilfreich?

Lösung 3

Aus den Messungen mich, ein Nachrichtenzyklus zwischen CPU und DSP dauert etwa 160us. Ich weiß nicht, ob dies wegen der Kernel verwende ich, oder den Brückentreiber; aber das ist eine sehr lange Zeit für eine einfache Back & Forth Messaging.

Es scheint, dass es nur vernünftig zu Port ist ein Algorithmus zum DSP, wenn die Gesamtrechenlast auf die Zeit für die Nachrichtenübermittlung erforderlich vergleichbar ist; und wenn der Algorithmus ist geeignet für die gleichzeitigen Computing auf CPU und DSP.

Andere Tipps

Der OMAP3430 nicht über eine an Bord DSP, hat es einen IVa2 + Video / Audio dekodieren Motor an den Systembus angeschlossen und der Cortex Kern DSP-wie SIMD-Befehle. Die GPU auf der OMAP3430 ist eine PowerVR SGX basierte Einheit. Während es programmierbaren Shadern hat, und ich glaube nicht, dass es keine Unterstützung für die allgemeine Programmierung ala CUDA oder OpenCL. Ich könnte falsch sein, aber ich habe noch nie eine solche Unterstützung

gehört

Wenn die IVa2 mit + Encoder / Decoder-Engine, die an Bord ist, dass Sie die richtigen Bibliotheken für dieses Gerät verwenden müssen, und es unterstützt nur bestimmte Codecs aus, dass ich weiß. Versuchen Sie, Ihre eigene Bibliothek zu diesem Modul zu schreiben?

Wenn die in DSPish (SIMD-Befehle) gebaut Cortex verwenden, schreiben einige Code.

Wenn Ihr dev Board hat einige zusätzliche DSP darauf, was der DSP ist und wie es mit dem OMAP verbunden?

In Bezug auf die Desktop-GPU Frage, im Fall von Video-Dekodierungs Sie die vender geliefert Funktionsbibliotheken verwenden, um Anrufe an die Hardware zu machen, gibt es mehr, VDAPU für Nvidia auf Linux, ähnlich Bibliotheken auf Windows (PureViewHD Ich denke, die genannt ). ATI hat auch Linux und Windows-Bibliotheken für ihre an Bord dekodieren Motoren, ich weiß nicht, die Namen.

Ich weiß nicht, was die Zeitbasis Ihrer Übertragung von Daten in ist, aber ich weiß, das TMS32064x, die für das SDK auf das SpecSheet aufgeführt ist eine sehr leistungsfähige DMA-Engine hat. (Ich nehme an, es das Orignal ZOOM OMAP34X MDK ist. Er sagt es ein 64xx hat.) Ich würde die OMAP hoffen, etwas simalar hat, nutzen sie zu ihrem vollsten Vorteil. Ich würde empfehlen „Pingpong“ Puffer im RAM des interal 64xx und unter Verwendung des SDRAM als Shared-Memory-Einrichtung mit den Übertragungen von DMA behandeln. Externe RAM wird einen Engpass auf einem der 6xxx Serie Teile sein, so halten, was Sie können in den internen Speicher gesperrt Leistung zu verbessern. Typischerweise werden diese Teile die Fähigkeit, Bus 8 32-Bit-Worte an den Prozessorkern haben, sobald sie im internen Speicher ist, aber das von einem Teil variieren auf teilweise basierend auf welcher Ebene Cache ermöglicht es Ihnen den direkten Zugriff RAM abzubilden. Kosten empfindliche Teile von TI bewegen, um den „mappable memory“ weiter weg als einige der anderen Chips. Auch alle Handbücher für die Teile sind von TI zum kostenlosen Download im PDF-Format zur Verfügung. Sie gaben mir sogar Hardcopies kostenlos von der TMS320C6000 CPU und Instruction Set Handbuch und vielen anderen Büchern.

Was die Programmierung betrifft Sie müssen möglicherweise einige der „Prozessor-Spezifika“ oder Inline-Assembler verwenden, jede Mathematik zu optimieren Sie tun. Für die 64xx Integer-Operation Gefallen, wenn möglich, da sie nicht über eine in Gleitkomma-Kern aufgebaut. (Das sind in der 67xx-Serie.) Wenn bei den Einheiten Ausfürung aussehen und Sie können Ihre Berechnungen, so dass die verschiedenen Teile zielen auf unterschiedliche Operationen in einer Weise abzubilden, die in einem einzigen Zyklus auftreten können, dann werden Sie in der Lage sein, die beste Leistung aus, um achive diese Teile. Der Befehlssatz manuelle Liste der Arten von ops, die von jeder Ausführungseinheit durchgeführt werden. Wenn Sie Sie Berechnung bis in einer doppelten Datenfluss Sätze brechen können und die Schleifen ein wenig entspannen wird der Compiler sein „schöner“ zu Ihnen, wenn sie voll optimizaiton eingeschaltet ist. Dies ist aufgrund der Tatsache, dass der Prozessor nach oben in eine linke und eine rechte Seite mit nahezu identischen Ausführungseinheiten auf beiden Seiten gebrochen wird.

Hope, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top