Laufen LabVIEW-Programme auf Multicore-Computern schneller?

Überblick

Dieses Dokument ist Teil der Serie zu den „Grundlagen der Multicore-Programmierung“
Grundlagen der Multicore-Programmierung

Grundlagen der Multicore-Programmierung

Mehrere Faktoren haben Einfluss darauf, ob sich die Leistung eines LabVIEW-Programms durch den Einsatz von Multicore-Systemen verbessert. Zu diesen Faktoren gehören die Besonderheiten der neuen Hardware, die Struktur der LabVIEW-Anwendung sowie die Systemsoftware selbst. Tests gängiger LabVIEW-Programmstrukturen ergeben aufgrund der natürlichen Parallelität von LabVIEW-Code durchschnittlich eine 25- bis 35-prozentige Verkürzung der Ausführungszeit. Jedoch können die Eigenschaften des jeweiligen Programms zu erheblichen Abweichungen von dieser Schätzung führen. Eine zusätzliche Optimierung eines LabVIEW-Programms für eine Multicore-Umgebung kann die Ausführungszeit nochmals wesentlich verkürzen. Dieses Whitepaper behandelt die wichtigsten Faktoren, welche die Leistung von LabVIEW-Programmen auf Multicore-Systemen beeinflussen.

Inhalt

Taktrate und Prozessoranzahl

LabVIEW skaliert Programme automatisch, um mehrere Prozessoren auf High-End-Rechnersystemen nutzen zu können. Dazu wird die Anzahl der verfügbaren Cores festgestellt und der Anwender bei der Entwicklung einer größeren Zahl von Threads unterstützt. LabVIEW erstellt beispielsweise acht Threads für die Programmausführung, wenn es auf einem Computer mit acht Prozessorkernen ausgeführt wird.

Mehrere Prozessoren, gleichbleibende Taktrate

Wird ein Single-Core-Rechensystem durch ein Multicore-System ersetzt, das Verarbeitungseinheiten mit denselben Taktraten wie beim Single-Core-System betreibt, verkürzt sich die Ausführungszeit von LabVIEW-Programmen. Im Idealfall erhöht sich die Geschwindigkeit der Programmausführung um einen Faktor, welcher der Anzahl von Cores eines Multicore-Systems entspricht (z. B. vervierfacht sich die Geschwindigkeit auf einem Quad-Core-System). Jedoch verhindert Overhead bei der Kommunikation zwischen Threads und Cores diese ideale Verbesserung der Geschwindigkeit. Ist das betreffende LabVIEW-Programm komplett sequenziell und läuft auf einem einzelnen Prozessor, benötigt es auf einem Prozessor, den es sich mit anderer Software teilt, weniger Zeit, wodurch auch die Ausführungszeit verkürzt wird. Ist das betreffende Programm komplett parallel und besteht aus Tasks derselben Größe ohne Datenabhängigkeit, lässt sich die bestmögliche Verbesserung der Ausführungszeit erzielen.

Mehrere Prozessoren, niedrigere Taktrate

Wird ein Single-Core Rechensystem durch ein Multicore-System ersetzt, das Prozessoren niedrigerer Taktraten verwendet, können Änderungen in der Ausführungszeit von LabVIEW-Programmen nicht eindeutig bestimmt werden. Ist ein LabVIEW-Programm vollständig sequenziell und besitzt exklusiven Zugriff auf einen einzigen Prozessorkern auf dem Multicore-System, wird der Einfluss auf die Ausführungszeit am ehesten durch die relativen Taktraten des Systems und das Task-Scheduling bestimmt. Die Ausführungszeit eines vollständig parallelen LabVIEW-Programms, das aus Tasks gleicher Größe ohne Datenabhängigkeit besteht und Zugriff auf alle verfügbaren Prozessorkerne des Multicore-Systems hat, ist auch von den relativen Taktraten und dem Task-Scheduling abhängig.

Kommunikations-Overhead

Speichermodelle

Die Speicherorganisation in Multicore-Rechnersystemen beeinflusst den Kommunikations-Overhead und die Ausführungsgeschwindigkeit von LabVIEW-Programmen. Gängige Speicherarchitekturen sind etwa gemeinsam genutzter Speicher, verteilter Speicher und hybrider, gemeinsam genutzter verteilter Speicher. Systeme mit gemeinsam genutztem Speicher verwenden einen großen globalen Speicherort, auf den alle Prozessoren zugreifen können, um eine schnelle Kommunikation zu ermöglichen. Jedoch tritt ein Kommunikationsengpass zwischen Prozessor und Speicher auf, wenn noch mehr Prozessoren mit demselben Speicher verbunden werden. Verteilte Speichersysteme nutzen für jeden Prozessor einen lokalen Speicherplatz und die Kommunikation zwischen den Prozessoren läuft über ein Kommunikationsnetzwerk ab. Die Kommunikation zwischen den Prozessoren ist hier langsamer als bei Systemen mit gemeinsam genutztem Speicher. Daneben werden in manchen Systemen hybride Speicherarchitekturen verwendet und so die Vorteile beider Modelle genutzt. Speichermodelle haben großen Einfluss auf den Kommunikations-Overhead und deshalb auch auf die Ausführungsgeschwindigkeit in jeder Programmiersprache (LabVIEW, C, Visual Basic etc.).

Kommunikation zwischen Prozessoren

Die physische Distanz zwischen den Prozessoren und die Qualität der Verbindungen haben aufgrund des Kommunikations-Overheads Einfluss auf die Ausführungzeit von LabVIEW-Programmen. Mehrere Prozessoren auf separaten Chips zeigen höhere Latenz bei der Kommunikation zwischen Prozessoren, als Prozessoren auf einem einzigen Chip. Daraus ergibt sich ein größerer Kommunikations-Overhead, der die Ausführungszeit von LabVIEW verlangsamt. In Abbildung 1 ist die Latenz beim System mit zwei Prozessoren (zwei Sockets) auf der linken Seite höher als auf dem einzelnen Chip mit Dual-Core-Prozessor, der rechts abgebildet ist.


[+] Bild vergrößern

Abbildung 1: Vergleich eines Dual-Prozessor- mit einem Dual-Core-Prozessor-System 

Programm und Software

Organisation von Programmcode

Die Ausführungszeit von LabVIEW-Programmen auf einem Multicore-Computer hängt in gleichem Maße vom Programm wie auch vom Computer ab, auf dem es läuft. Das Programm muss so geschrieben sein, dass es von den Vorteilen der Multicore-Systeme profitiert. Der Grad der Programmparallelität ist von großer Bedeutung, ebenso die Aufteilung (Berechnungen im Verhältnis zur Kommunikation) und die Lastverteilung. Ein großer Teil bestehenden G-Codes wurde zwar für die sequenzielle Ausführung geschrieben, jedoch ist diese Art Code aufgrund der Datenflussprogrammierung bis zu einem gewissen Grad parallel. Wie bereits erwähnt, zeigen Tests gängiger Strukturen von LabVIEW-Programmen durchschnittlich eine 25- bis 35-prozentige Verkürzung der Ausführungszeit, wenn sie von einem Single- auf ein Multicore-System migriert werden. Die Eigenschaften des jeweiligen Programms können allerdings zu erheblichen Abweichungen von dieser Schätzung führen. Die Optimierung eines LabVIEW-Programms für eine Multicore-Umgebung kann die Ausführungszeit wesentlich verkürzen, wenn mit einem Multicore-Rechner gearbeitet wird.

Hardwarespezifische Abstimmung

G-Code so zu organisieren, dass die Ausführungszeit verkürzt wird, ist kompliziert, wenn man die Hardware nicht kennt, auf der das Programm ausgeführt wird. Damit die optimale Ausführungszeit erreicht wird, ist es unbedingt notwendig, das System zu verstehen, auf dem ein Multicore-Programm läuft. Multicore-Programmiertechniken erfordern für Systeme mit einer unbekannten Anzahl von Cores eine allgemeinere Methode. Diese gewährleistet ein gewisse Verkürzung der Ausführungszeit auf den meisten Multicore-Maschinen, verhindert aber möglicherweise die maximale Geschwindigkeit auf einem spezifischen Gerät. Die hardwarespezifische Abstimmung von LabVIEW-Programmen kann recht zeitaufwändig sein, ist aber nicht immer notwendig. Um ein System mit acht Cores voll auszunutzen, können parallele Programmiertechniken eingesetzt werden, wie etwa Datenparallelität und Pipelining. Darüber hinaus profitieren Anwender von der Anzahl von Cores in einem System, dem Core-Layout (zwei Dual-Cores oder ein Quad-Core), deren Verbindung, der Speicherarchitektur sowie von bekannten Fehlern, und erreichen so die kürzeste auf Multicore-Systemen mögliche Programmausführung.

Weitere Informationen über parallele Programmiertechniken stehen hier zur Verfügung:

Software und Parallelität

Probleme bei der Umsetzung von Parallelität können in verschiedenen Softwareebenen auftreten. In traditionellen Programmiersprachen wie C stellt dies eine besondere Herausforderung dar. Im Gegensatz dazu profitiert die LabVIEW-Programmierung von einer Multicore-fähigen Entwicklungsumgebung. Um diese Leistungsgewinne zu realisieren, hat die Software vier Schichten, die im Hinblick auf ihre Multicore-Fähigkeit evaluiert werden müssen: Entwicklungswerkzeug, Bibliotheken, Gerätetreiber und Betriebssystem. Sind diese Schichten nicht bereit für Multicore, sind Leistungszuwächse eher unwahrscheinlich, die Leistung könnte sogar noch absinken. Tabelle 1 zeigt, wie LabVIEW für alle Schichten Multicore-fähige Software bereitstellt.

 

Softwarekomponenten

Bedeutung von „Multicore-Fähigkeit“

LabVIEW-Support

Entwicklungswerkzeug

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

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

Bibliotheken

Thread-sichere, ablaufinvariante Bibliotheken

Beispiel: Analysebibliotheken

Gerätetreiber

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

Beispiel: Treibersoftware NI-DAQmx

Betriebssystem

Betriebssystem unterstützt Multithreading und Multitasking und kann Tasks gleichmäßig verteilen

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

 

Multicore-Systeme mit Bibliotheken und Treibern, die noch nicht Multicore-fähig sind bzw. Betriebssysteme, die Tasks nicht auf mehrere Prozessoren verteilen können, führen parallele LabVIEW-Programme nicht schneller aus.

Weitere Ressourcen zur Multicore-Programmierung