LabVIEW in der Multicore-Programmierung

Überblick

Da es sich bei LabVIEW von National Instruments um eine Programmiersprache nach dem Datenflussprinzip handelt, können Entwickler parallele Anwendungen schreiben, die zusammen mit paralleler Hardware wie etwa Multicore-Prozessoren und FPGAs optimale Leistung erzielen. Dieses Whitepaper erläutert die Datenflussprogrammierung und legt dar, warum sich NI LabVIEW so gut für die Programmierung von Multicore-Systemen eignet.

Inhalt

Das Ende der Fahnenstange ist erreicht

Prozessorgeschwindigkeiten sind in den letzten Jahren in einer Sackgasse angelangt. Das Mooresche Gesetz, das besagt, dass sich die Anzahl an Transistoren auf einem Chip alle 18 bis 24 Monate verdoppelt, gilt auch weiterhin, so wie bereits seit 40 Jahren. Allerdings lässt sich inzwischen keine lineare Steigerung der Leistung mehr erzielen. Bisher erhöhten die Chiphersteller die Geschwindigkeit des Prozessortakts, um die Chipleistung zu verdoppeln: von 100 MHz auf 200 MHz und seit kurzem bis in den Bereich von mehreren Gigahertz (GHz).

Momentan jedoch ist eine weitere Steigerung der Taktgeschwindigkeiten zur Erzielung von Leistungssteigerungen wegen des Stromverbrauchs und der Wärmeabgabe nicht realisierbar. Chipanbieter sind deshalb zu gänzlich neuen Chiparchitekturen mit mehreren Prozessorkernen auf einem Chip übergegangen. Mithilfe mehrerer Prozessoren können Programmierer insgesamt mehr Arbeit erledigen als mit einem einzelnen Kern. Um Multicore-Prozessoren gut auszunutzen, müssen Programmierer die Vorgehensweise bei der Entwicklung von Applikationen neu überdenken. Anders ausgedrückt ist für alle Entwickler, die von ihren Softwareanwendungen automatisch mehr Leistung erwarten, wenn sie auf Computern mit schnelleren Prozessoren ablaufen, das Ende der Fahnenstange erreicht. Kurz gesagt, Software hat es lange Zeit leicht gehabt, doch ist das nicht länger der Fall.

Abbildung 1: Das Mooresche Gesetz zeigt, dass Prozessoren nicht mehr schneller werden. Deshalb verlegen sich Hersteller wie Intel und AMD darauf, mehrere Prozessoren auf einem Chip unterzubringen.

Sequenziell ablaufende Programme konnten in Folge der höheren Prozessortaktgeschwindigkeiten höhere Leistung erbringen. Die Umstellung auf einen Computer mit einem schnelleren Hauptprozessor brachte mit sich, dass jeder einzelne Befehl einer Reihe schneller ausgeführt wurde. Damit es bei Multicore-Systemen ebenfalls zu Leistungssteigerungen kommt, müssen Entwickler ihre Applikationen so entwerfen, dass sie die Arbeit zwischen den Kernen aufteilen. Sie müssen also im Wesentlichen eine parallele statt einer sequenziellen Applikation entwickeln.

LabVIEW – grafische Programmierung nach dem Datenflussprinzip

Der größte Vorteil bei einer Anwendungsentwicklung in LabVIEW liegt in der intuitiven, grafischen Natur dieser Programmiersprache. Die Lösung technischer Probleme in LabVIEW geschieht fast so, als würde der Entwickler ein Blockdiagramm auf Papier zeichnen. Gerade für moderne Multicore-Prozessoren ist LabVIEW die passende Wahl als Programmierwerkzeug, da es Aufgaben parallel abbilden und ausführen kann.

Die Datenflussstruktur von LabVIEW ist der Grund dafür, dass bei jeder Verdrahtung mit einer Abzweigung oder bei einer parallelen Sequenz auf dem Blockdiagramm die dahinter liegende ausführbare Datei in LabVIEW eine parallele Ausführung versucht. In der Computerfachsprache ist das eine „implizite Parallelität”, da nicht speziell Programmcode mit dem Zweck geschrieben werden muss, ihn parallel auszuführen. Die Sprache kümmert sich selbst um einen gewissen Grad an Parallelität.

Der theoretische Leistungsvorteil der Umstellung von einem Single- auf einen Dual-Core-Computer ist eine zweifache Verbesserung. Aber ob man wirklich den maximalen theoretischen Nutzen daraus ziehen kann, hängt davon ab, in welchem Ausmaß eine parallele Programmausführung erreicht werden kann. LabVIEW Programmierer stellen ihre Lösungen gewöhnlich parallel dar. Erste Bewertungen einer gängigen Darstellung von LabVIEW Anwendungen (ohne Berücksichtigung von Multicore-Programmiertechniken) zeigen, dass Applikationen automatisch Leistungsverbesserungen zwischen 25 und 35 Prozent erzielen, ohne dass dazu der Programmcode geändert wurde. Das liegt einfach am natürlichen Anteil der Parallelität in LabVIEW Programmen.

Abbildung 2 zeigt eine einfache Anwendung, bei der eine Verzweigung im LabVIEW Code zwei Analyseaufgaben – eine Filteroperation und eine FFT-Analyse (Fast Fourier Transform) – ermöglicht, die parallel auf einem Dual-Core-Gerät ausgeführt werden. Nicht abgebildet ist der Code, der die For-Schleife einmal im Single-Core-Modus ausführt, indem einer der Kerne ausgeschaltet wird, und dann im normalen Dual-Core-Modus. Da beide Aufgaben sehr rechenintensiv sind, liegt die Verbesserung auf Grundlage der Parallelität dieser Aufgabe bei Faktor 1,8.

Abbildung 2: Eine typische LabVIEW Anwendung ist aufgrund der Datenflussprogrammierung von Natur aus parallel.

Textbasierte Sprachen wie etwa C drücken parallelen Programmcode mithilfe einer speziellen Notation im Code aus, der die parallelen Aufgaben (d. h. die Erstellung einmaliger Threads) erzeugt. Die Verwaltung solcher multithreading-fähiger Applikationen kann eine beträchtliche Herausforderung darstellen.

In C ist die Synchronisation über Locks, Mutexes, Semaphoren und weitere anspruchsvolle Programmiertechniken umzusetzen. Können mehrere Threads nur noch schwer verfolgt werden, tauchen evtl. gewisse Tücken beim Programmieren auf, wie beispielsweise folgende:

  • Verschlechterung der Prozessorleistung aufgrund zu vieler Threads
  • Deadlock: Threads werden während des Wartens aufgehalten und können nicht weiter verarbeitet werden.
  • Race Conditions: Das Timing der Programmcodeausführung wird nicht richtig verwaltet und Daten sind entweder bei Bedarf nicht verfügbar oder die richtigen Daten wurden überschrieben.
  • Speicherkonflikte: Mehrere Threads versuchen gleichzeitig auf den Speicher zuzugreifen.

Aufgrund dieser Herausforderungen bei der Entwicklung in C erzielen LabVIEW Programmierer eine größere Produktivitätssteigerung als je zuvor.

LabVIEW bietet Komponenten für den Multicore-Einsatz inklusive SMP-Unterstützung auf Echtzeitsystemen

Intel hat vier Schichten in den Softwarekomponenten definiert, mit denen die „Bereitschaft“ für die Multicore-Entwicklung evaluiert werden kann. Parallele Programme laufen auf Multicore-Systemen nicht schneller ab, wenn die eingesetzten Bibliotheken und Treiber nicht für den „Multicore-Einsatz“ geeignet sind oder das Betriebssystem Aufgaben nicht über mehrere Kerne verteilen kann.

Softwarekomponenten

Die Bedeutung von „bereit für Multicore“

LabVIEW Support

Entwicklungswerkzeug

Support für ein beliebiges Betriebssystem; Werkzeug ermöglicht korrektes Threading und Optimierung

Multithreading-Fähigkeit von LabVIEW und Strukturen, die Optimierung erlauben

Bibliotheken

Thread-sichere, ablaufinvariante Bibliotheken

Analysebibliotheken

Gerätetreiber

Treiber, die für eine optimale multithreading-fähige Leistung entwickelt wurden

Treibersoftware NI-DAQmx

Betriebssystem

Betriebssystem unterstützt Multithreading und Multitasking und kann Tasks ausgewogen verteilen

Support für Windows, Mac OS, Linux und echtzeitfähige Betriebssysteme

Abbildung 3: Beschreibung von „Multicore-fähigen“ Softwarekomponenten

Ein Beispiel der Gerätetreibersoftwareschicht ist die Treibersoftware NI-DAQmx. Ein traditioneller NI-DAQ (Legacy) Treiber ist thread-sicher, d. h. die gesamte Bibliothek blockiert andere Threads, so dass diese sie nicht aufrufen, wenn eine NI-DAQ Funktion aufgerufen wird.

Auf den ersten Blick erscheint dieses Verhalten logisch, weil NI-DAQ zur Steuerung von Hardware eingesetzt wird, die häufig für eine einzelne Ressource gehalten wird. NI-DAQmx, der überarbeitete, moderne Datenerfassungstreiber, ist ablaufinvariant, was bedeutet, dass mehrere Datenerfassungsaufgaben parallel ausgeführt werden können, ohne Threads zu blockieren.

Bei diesem Ansatz kann der Treiber mehrere Aufgaben unabhängig voneinander auf demselben Gerät ausführen, so etwa Analog- und Digital-I/O.

Auf der untersten Ebene der Software, dem Betriebssystem, unterstützen die führenden Anbieter von Echtzeitbetriebssystemen bisher keine automatische Lastverteilung von Threads über mehrere Kerne.

LabVIEW 8.5 ermöglicht den Einsatz des automatischen Multithreading-Steuerprogramms – bekannt als symmetrisches Multiprocessing (SMP) – auf deterministischen Echtzeitsystemen.

 

Fazit

Anwender, die schnellere Messungen für Tests oder verbesserte Schleifenraten bei Steuerungsanwendungen benötigen, müssen überlegen, wie sie parallele Applikationen implementieren können. LabVIEW 8.5 bietet sogar noch mehr Funktionen für die Multithreading-Fähigkeiten der Sprache, die ursprünglich im Jahr 1998 mit der Version 5.0 eingeführt wurden. LabVIEW stellt eine Softwareumgebung zur Verfügung, die ideal für die parallele Programmierung ist. Sie geht von einem Datenflussansatz aus, bietet erstklassigen Multicore-Support für Embedded-Plattformen, die mit LabVIEW Real-Time entwickelt wurden, und verfügt über Softwarekomponenten, die durchgängig Multicore-fähig sind.