Timing-Komplexität für die Korrelationsimplementierung auf FPGA

Nehmen wir an, wir haben eine Datenbank mit fünftausend diskreten Signalen mit 512 Punkten . Jeder Datenbankeintrag ist für sich einzigartig. Der wichtige Punkt, den es bei den Signalen in der Datenbank zu beachten gilt, ist, dass von den 512 Punkten mehr als die Hälfte der Punkte für alle Signale Null sind. Nun erfassen wir ein diskretes 512-Punkt-Signal von außen (Details müssen keine Rolle spielen). Dieses Signal entspricht einem der Signale in den fünftausend Einträgen der Datenbank. Ich vergleiche das erfasste Signal, indem ich die Spearman-Korrelation nehmedes erfassten Signals mit jedem der fünftausend Signale und der Eintrag, der den höchsten Korrelationskoeffizienten ergibt, ist am nächsten und zeigt das erfasste Signal. Diese Korrelationsoperation, insbesondere die 512-Punkte-Korrelation, nimmt in MATLAB viel Zeit in Anspruch. Offensichtlich gibt es Latenz auf dem PC, was der Hauptgrund für den Zeitverbrauch ist. Der Zeitaufwand für die Berechnung der Korrelation des erfassten Signals mit jedem der 5000 Datenbankeinträge beträgt durchschnittlich 2,3 Sekunden.

Nehmen wir nun an, dass ich genau das auf einem FPGA (Virtex-7 Xilinx-Familie) implementieren möchte. Ich denke, dass die Korrelationsoperation parallel durchgeführt werden kann, da das erfasste Signal nur eines ist und die Datenbankeinträge im FPGA gespeichert werden können. Es können also nicht alle 5000 Signale parallel korreliert werden, wenn jedoch mindestens 1000 parallel korreliert werden können, reduziert sich die Zeit auf dem FPGA erheblich. Meine Frage ist also, wie viele Signale ich gleichzeitig auf diesem FPGA korrelieren könnte und wie viel Zeit insgesamt für diese 512-Punkte-Korrelation benötigt wird, wenn sie auf diesem FPGA implementiert wird.

Schätzen Sie zuerst die Speicheranforderungen und bepreisen Sie ein FPGA mit dem erforderlichen internen Speicher. Oder bestimmen Sie, wie schnell Sie alle 5000 Signale von einem externen Speicher (SRAM, SDRAM, DDR usw.) streamen können.

Antworten (2)

Wenn wir 2 Bytes pro Abtastpunkt (16 Bits) annehmen, dann haben Sie etwa 5 MB Datenbankdaten, was ziemlich genau den externen Speicher vorschreibt, um sie auf allen außer den allergrößten FPGAs zu halten. Die externe Speicherschnittstelle wird der ratenbegrenzende Schritt im Korrelationsprozess sein.

Wenn Sie eine Reihe von DDR-Speicherchips haben, könnten Sie eine Schnittstelle haben, die beispielsweise 64 Bit breit ist und mit 200 MHz oder so läuft, was Ihnen eine Rohbandbreite von 3,2 GB/Sekunde gibt. Dadurch können Sie Ihre Datenbank in weniger als 2 ms durchsuchen.

Dann müssen Sie nur sicherstellen, dass Sie über genügend parallele Logik verfügen, um Ihre Korrelation so schnell zu berechnen, wie die Daten eingehen. Ich bin mit den Details der Spearman-Korrelation nicht vertraut genug, um dort Vorschläge zu machen.

Ohne mehr über Ihre Anwendung zu wissen, ist es ziemlich klar, dass das Problem in MATLAB und nicht im PC liegt. Aus Ihrer Beschreibung geht hervor, dass Ihr Verarbeitungsalgorithmus schrecklich ineffizient ist, und ein Software-Umdenken kann Ihnen viel Zeit, Mühe und Geld sparen.

Betrachten Sie eine Spearman-Korrelation. Anstatt 2 Datenarrays, x() und y(), zu korrelieren, führt es die Operation aus

C = 1 6 Σ ( R X R j ) 2 N ( N 1 )
wobei Rx und Ry die Rangordnungen in den Arrays x und y sind. Das heißt, ihre Reihenfolge in einer sortierten Liste.

Wenn MATLAB also versucht, die Summe zu berechnen, muss es zunächst 5001 Arrays mit 512 Elementen sortieren und für jedes Array eine Rangliste erstellen, was sehr viel Zeit in Anspruch nimmt. Zur Veranschaulichung: Mit einem kompilierten Basic dauert es nur etwa 10 ms, um die Kern-Multiplikations-Akkumulation auf 5000 512-Sample-Arrays auf meinem Computer durchzuführen und ein 5000-Element-Array von Ergebnissen zu erzeugen.

Dies ist eine grobe Zeitverschwendung, da 5000 von 5001 Arrays vorberechnet werden können, da sie sich zwischen den Läufen nicht ändern.

Anstatt also MATLAB und Brute-Force zu verwenden, beginnen Sie damit, Ihre 5000 Referenz-Arrays zu sortieren und für jedes ein entsprechendes Ranking-Array zu generieren. Sie müssen dies nur einmal tun und diese vorberechneten Ranking-Arrays jedes Mal verwenden, wenn Sie ein neues Datenarray auswerten.

Wenn Sie ein neues Datenarray erhalten, sortieren Sie es und erstellen Sie ein Ranking-Array, und führen Sie dann Ihre Quadrierung / Akkumulation durch. Dies wird viel weniger Zeit in Anspruch nehmen als Ihr derzeitiger Ansatz.

Beachten Sie auch, dass Sie je nachdem, was Sie mit Ihren Korrelationen tun, möglicherweise nicht für alle Korrelationen dividieren oder subtrahieren müssen. Wenn Sie beispielsweise nur an den 10 besten Korrelationen interessiert sind, können Sie die MAC-Ergebnisse sortieren, die 10 besten auswählen und dann Ihre endgültigen Berechnungen durchführen.

All dies kann als Vorschlag interpretiert werden, dass Sie, anstatt auf der EE SE zu posten, es in Erwägung ziehen sollten, es auf der Computational Science SE zu versuchen und nach Wegen zu fragen, wie Sie Ihre Berechnungen beschleunigen können.