Document ID: /fineweb-2-swissfilter-quality_10-filterrobots/filtered/03540.jsonl.gz/1208

Echtzeit-Datenaustausch zwischen FPGA und GPU
Deshalb ist die direkte Kommunikation zwischen GPU und FPGA die zentrale Herausforderung in einem solch kombinierten Design. Jedoch steuert typischerweise die CPU die Datenkommunikation, die bei hohen Datenraten oft zum Flaschenhals des Systems wird.
Dieser Artikel zeigt eine neue Methode für ein effizientes GPU-FPGA-Co-Design namens Frame-based DMA (FDMA), das auf GPUDirect basiert. Dabei wird die CPU für den Datentransfer nicht benötigt. Diese vielseitige Lösung kann für eine Vielzahl verschiedener Anwendungen eingesetzt werden, bei denen harte Echtzeitfähigkeiten erforderlich sind.
Das Institute of Embedded Systems (InES) der Zürcher Hochschule für Angewandte Wissenschaften (ZHAW) hat die FDMA-Technologie für den direkten Datentransfer zwischen dem FPGA und der GPU entwickelt. Auf der FPGA-Seite wurde dafür eine FDMA-IP entwickelt und mit einer Implementierung, basierend auf der Xilinx-XDMA-IP, verglichen.
Indirekter Datenaustausch führt zu höheren Latenzzeiten
Kopiert die CPU die Daten, z. B. von einem FPGA zur GPU, entspricht das einem indirekten Datenaustausch. Dieser Datenaustausch ist indirekt, weil die Daten vom FPGA-Speicher in den CPU-Speicher und in einem zweiten Schritt von der CPU in den GPU-Speicher kopiert werden. Das hat zur Folge, dass die Daten zwei Mal über PCIe übertragen werden müssen. Dabei wird CPU-RAM für das Zwischenspeichern benötigt, und die zwei Datentransfers müssen miteinander synchronisiert werden. Das führt zu verlängerten Transferzeiten und zu erhöhter Busauslastung. Da Host-Betriebssysteme, wie z. B. Linux oder Windows, für zeitkritische Echtzeit-Anwendungen nicht optimal sind, ist ein indirekter Transfer über die CPU für Anwendungen mit engen Echtzeit-Anforderungen nicht möglich. Um Daten direkt vom FPGA-RAM zum GPU-RAM oder umgekehrt zu kopieren, muss entweder das FPGA Zugriff auf den GPU-Speicher haben oder umgekehrt. Die an der ZHAW entwickelte Methode verwendet GPUDirect, um dem FPGA Zugriff auf den GPU-Speicher zu gewährleisten.
GPUDirect in Nvidia-GPU
Nvidia-Quadro- und Tesla-GPU unterstützen mit GPUDirect-RDMA das Spiegeln von GPU-RAM in den Host-IO-Memory-Adressraum. Die CPU und auch andere PCIe-Geräte können danach direkt auf den gespiegelten Speicherbereich zugreifen. Somit hat das FPGA mit GPUDirect direkten Zugriff auf den gespiegelten GPU-Speicher.
ZHAW-FDMA-Implementation
Für die direkte FPGA-GPU-Kommunikation wurde am Institute of Embedded Systems der ZHAW eine spezielle DMA-FPGA-IP entwickelt. Diese sogenannte Frame-based-DMA-IP (FDMA) ist so konzipiert, dass sie nach dem Einrichten des Systems ohne jegliche Host-Interaktion funktioniert. Die FDMA-IP ist eine Schnittstelle zwischen einer Datenquelle und einer Datensenke im FPGA sowie in fest definierten Speicherbereichen in der GPU. Zur Datenquelle und -senke hat sie jeweils ein AXI-Stream-Interface. Zur GPU arbeitet sie mittels eines AXI-Master-Interface. Durch die AXI-to-PCIe-Bridge-IP von Xilinx kann über eine AXI4-Schnittstelle direkt im IO-Memory-Bereich des Host-Systems gelesen und geschrieben werden. Auf der GPU-Seite unterstützt die FDMA-IP mehrere RX- und TX-Puffer. Das ermöglicht die Verwendung eines Puffers zum Lesen oder Schreiben, während die anderen Puffer für die GPU-Prozesse zur Verfügung stehen. Jeder GPU-Puffer hat ein Status-Flag im GPU-RAM. Dieses Flag zeigt an, wer Zugriff auf diesen Puffer hat, und wird zur Synchronisation zwischen GPU und FPGA verwendet.
Nach dem Systemstart kann das Host-System die FDMA-IP und die GPU-Prozesse einmalig konfigurieren und starten. Danach ist das System vom Host unabhängig. Sind z. B. am FPGA eine oder mehrere Kameras angeschlossen, werden diese Daten zur FDMA-IP übertragen, die dann das Flag des ersten RX-Puffers abfragt. Ist dieser Bereich bereit zum Schreiben, werden die Kamera-Frames in den ersten Puffer geschrieben. Durch ein Aktualisieren des Flags wird der GPU mitgeteilt, dass dieser Puffer neue Daten enthält, die gültig sind. Danach wird automatisch das Flag des nächsten RX-Puffers gelesen, und wenn er bereit ist, werden die nächsten Kameradaten geschrieben. Die GPU muss nur die Flags der nicht mehr benötigten Puffer zurücksetzen. Der Datentransfer von der GPU zum FPGA funktioniert genau gleich. Ist ein Speicherbereich nicht bereit für einen Datentransfer, dann liest die FDMA das Flag periodisch, bis der Bereich bereit ist.
Vergleichsimplementation
Die FDMA-Implementierung wurde mit einer Implementation, basierend auf der Xilinx-XDMA-IP, verglichen. Diese kopiert ebenfalls Daten direkt vom FPGA-RAM in den GPU-Speicher und umgekehrt. Mit der XDMA-IP muss jedoch jeder Datentransfer vom Host-System initialisiert werden. Die Ausgangs- und Zieladresse sowie auch die Länge jedes Transfers sind frei wählbar. Weil das Host-System jeden Transfer aufsetzen muss, müssen die Prozesse auf dem FPGA und der GPU mit dem Host-System synchronisiert werden. Somit können mit der XDMA IP sehr flexibel und effizient Daten direkt zwischen GPU und FPGA hin und her kopiert werden, jedoch mit dem Nachteil, dass der Host in jeden Datentransfer involviert ist.
Messresultate
Beide Implementationen wurden mit einem Kintex7-FPGA von Xilinx und einer Quadro-P2000-GPU von Nvidia getestet. Der langsamste PCIe-Link hat mit Gen 2 × 4 eine theoretische Linkgeschwindigkeit von 16 Gbit/s. Abb. 3 zeigt die durchschnittliche Datenrate für verschiedene Übertragungsgrössen. FDMA ist bei kleinen Transfers schneller, da der Host nicht jeden Transfer initialisieren muss. Bei grösseren Blockgrössen ist die XDMA-Implementierung beim Transfer von der GPU zum FPGA schneller. Alle bis auf den genannten Transfer erreichen bei grösseren Blockgrössen etwa 72 bis 86 Prozent der theoretisch möglichen Datenrate.
Für viele Echtzeit-Anwendungen ist jedoch nicht die maximal mögliche Datenrate, sondern auch die Stabilität der Ausführungszeit eines Datentransfers ausschlaggebend. Dafür wurden mit beiden Implementierungen je 10 Millionen 32 Byte Datentransfers gemacht und die Ausführungszeit jedes Transfers gemessen. Abb. 4 und Abb. 5 zeigen die Histogramme dieser Messungen.
Wie erwartet, ist in der Messung mit XDMA ein starker Transfer-Jitter bemerkbar. Diese Instabilität der Ausführungszeit kommt vom Task-Scheduling des Host-Systems. Eine der 10 Millionen Datentransfers dauerte ganze 3,4 ms statt der durchschnittlichen 20 Mikrosekunden. Bei einem Echtzeit-Algorithmus könnte das zu Sample-Verlusten führen. Bei der FDMA-Implementierung ist ein solcher Transfer-Jitter praktisch nicht vorhanden.
Fazit
Beide Implementierungen, FDMA und XDMA, nutzen direkte Transfers zwischen FPGA und GPU und entlasten damit die CPU. Die an der ZHAW entwickelte FDMA-Implementierung benötigt nach dem Set-up keine Host-Interaktion, und der Transfer-Jitter ist praktisch nicht vorhanden. Das macht die FDMA-Implementierung ideal für zeitkritische Echtzeit-Streaming-Anwendungen.
zhaw.ch