Bis vor Kurzem führten Fortschritte bei Computerhardware zu einer deutlichen Steigerung der Ausführungsgeschwindigkeit von Software – und das mit geringem Aufwand für die Softwareentwickler. Die Erhöhung der Prozessorgeschwindigkeit sorgte für einen sofortigen Anstieg der Softwaregeschwindigkeit. Da die Prozessorgeschwindigkeiten jedoch ihren Höhepunkt erreichen und Prozessorhersteller neue Verfahren zur Erhöhung der Rechenleistung einsetzen, ändert sich dies allmählich. Die Einführung von Multicore-Prozessoren stellt eine neue Herausforderung für Softwareentwickler dar, die nun die notwendigen Programmiertechniken beherrschen müssen, um das Multicore-Verarbeitungspotenzial zu nutzen. Eine dieser Programmiertechniken ist Task-Parallelität.
Unter Task-Parallelität versteht man einfach die gleichzeitige Ausführung unabhängiger Tasks in Software. Stellen Sie sich einen Single-Core-Prozessor vor, auf dem ein Webbrowser und ein Textverarbeitungsprogramm gleichzeitig ausführt werden. Obwohl diese Anwendungen in separaten Threads ausgeführt werden, teilen sie sich letztlich denselben Prozessor. Stellen Sie sich nun ein zweites Szenario vor, in dem dieselben beiden Programme auf einem Dual-Core-Prozessor ausgeführt werden. Auf dem Dual-Core-Rechner können diese beiden Anwendungen im Wesentlichen unabhängig voneinander ausgeführt werden. Obwohl sie einige Ressourcen gemeinsam nutzen können, die verhindern, dass sie vollständig unabhängig ausgeführt werden, kann der Dual-Core-Computer die beiden parallelen Tasks effizienter ausführen.
Dank ihres inhärenten Parallelismus ist die grafische Entwicklungsumgebung LabVIEW von NI die ideale Programmiersprache für die Verwendung paralleler Programmiertechniken. Herkömmliche befehlsorientierte Programmiersprachen weisen eine sequenzielle Syntax auf und lassen sich daher nur schwer parallel darstellen und organisieren. Im Gegensatz dazu lässt sich eine Multithread-Anwendung in NI LabVIEW intuitiv und einfach erstellen.
Das grafische Programmierparadigma von LabVIEW erleichtert die parallele Programmierung – selbst für Anfänger. Zwei separate Tasks, die hinsichtlich der Daten nicht voneinander abhängig sind, werden parallel ausgeführt, ohne dass eine zusätzliche Programmierung erforderlich ist.
In Abbildung 1 ist eine einfache Datenerfassungsroutine dargestellt. Der obere Codeabschnitt besteht aus einem Task zur Erfassung analoger Spannungen und der untere Code ist ein Task zur Ausgabe digitaler Signale.
Abbildung 1: In LabVIEW werden zwei Codeabschnitte ohne Datenabhängigkeiten unabhängig voneinander parallel ausgeführt.
Diese beiden unabhängigen Datenerfassungs-Tasks müssen sich dieselbe CPU auf einem Single-Core-Prozessor teilen. Auf einem Multicore-Prozessor kann jeder Thread auf seinem eigenen Prozessor ausgeführt werden, was die Ausführungsgeschwindigkeit erheblich verbessert.
Bei der Verwendung von Datenparallelität in einer Anwendung muss unbedingt sichergestellt werden, dass die beiden Tasks keine gemeinsam genutzten Ressourcen aufweisen, was zu einem Engpass führen könnte, wie etwa der Code in Abbildung 2.
Abbildung 2: Wenn ein Task hinsichtlich der Daten von einem anderen Task abhängig ist, können die beiden Tasks nicht unabhängig voneinander ausgeführt werden.
In diesem Programm verwenden die beiden Tasks Daten gemeinsam und der digitale Task muss warten, bis der analoge Task begonnen hat. Dieser Code scheint zwar parallel zu sein, ist es jedoch nicht wirklich, da die beiden Tasks Daten austauschen. Es ist wichtig, sich dieser Fallstricke bewusst zu sein, wenn Anwendungen mit Task-Parallelität programmiert werden.
Bei der Eaton Corporation nutzte ein Entwicklerteam, dessen einzige Aufgabe die Verfeinerung von Test- und Messsystemen ist, die in der Forschungsabteilung für Lkw eingesetzt werden, die Leistung der Multicore-Verarbeitung und die Multithreading-Architektur von LabVIEW, um die Anzahl der durch die Systeme von Eaton laufenden Kanäle mehr als zu vervierfachen und einen Echtzeitdeterminismus zu erzielen. Diese LabVIEW-Anwendung umfasst drei asynchrone Schleifen für das Abschließen der parallelen Tasks für die Erfassung, Teststeuerung und Benutzeroberfläche. Vor der Implementierung dieser Lösung konnte das Team seine Testanforderungen nur erfüllen, indem es entweder die Arbeitslast sequenziell aufteilte oder mehrere Single-Core-Desktop-Computer zur Ausführung der Anwendung verwendete. Mit handelsüblichen Standard-Desktop-Systemen konnte das Team Stromverbrauch, thermische Leistung und Testzeit minimieren und so die Gesamtkosten senken.
Mit Task-Parallelität und anderen Programmiertechniken können Softwareentwickler die Leistungsvorteile der Multicore-Verarbeitung voll ausschöpfen. Entwickler, die diese Techniken kennen und verstehen, sind in der Lage, Anwendungen für die Computing-Trends der Zukunft vorzubereiten. Dank der an sich parallelen Natur der grafischen Programmierumgebung LabVIEW erhalten Entwickler die Möglichkeit, die Anwendungen von morgen effektiv zu generieren.