Multi-Core-Programmierung Das Optimum herausholen

Beispiel für ein Auslastungsdiagramm nach erfolgter Analyse durch SLX
Beispiel für ein Auslastungsdiagramm nach erfolgter Analyse durch SLX

Multicore-Prozessoren sind nichts Neues, doch in vielen Fällen können Entwickler nicht die Leistung nutzen, die diese Prozessoren eigentlich bieten. Mit SLX von Silexica kann sich das ändern, denn die lizenzierbare Tool-Suite hilft, Software für Mehrkernsysteme zu optimieren.

Silexica versucht zwei grundlegende Probleme zu lösen: Sequenziellen Code für eine parallele Ausführung zu optimieren und die optimale Hardware für die Software zu finden. Gerade die Programmierung von heterogenen Supercomputern stellt aus der Sicht von Maximilian Odendahl, CEO von Silexica, ein Problem dar, das gelöst werden muss, um Entwicklungen wie 5G, AR/VR oder selbstfahrende Autos sinnvoll realisieren zu können. Aus seiner Sicht haben all diese Applikationen einen Punkt gemeinsam: »Sie brauchen all die Rechenleistung, die sie bekommen können«, so Odendahl.

Als Rechenknechte gibt es eine Vielzahl von Prozessoren, wie GPUs, CPUs, ARM, RISC-V, eine Unzahl von AI-Chips (AI: Artificial Intelligence) und FPGAs. Diese können sowohl auf IC- als auch auf Systemebene beliebig kombiniert werden, um so die Rechenleistung für komplexe Anwendungen zu erreichen. Aber diese Kombination stellt auch eine Herausforderung für die Programmierer da.

In der Vergangenheit hatten die Programmierer noch ein ziemlich einfaches Leben, denn sie mussten eine Anwendung programmieren, die auf einem Prozessor lief. Heute sind es viele verschiedene Anwendungen, die auf heterogenen Multi-Core-Systemen mit ARM, DSPs, GPUs etc. laufen. Dabei stellt sich die erste Frage: Wie lässt sich existierender Code auf eine parallele Architektur migrieren? Odendahl: »Wenn ich keinen parallelen Code habe, kann ich auch nichts auf die verschiedenen Cores verteilen.« Und wenn ich parallelen Code habe, stellt sich wiederum die zweite Frage: Wie verteile ich ihn am besten auf die Recheneinheiten einer Plattform? Wobei bei dieser Frage noch unterschiedliche Optimierungskriterien berücksichtigt werden müssen. Einmal geht es um höchste Performance, ein anderes Mal um eine möglichst geringe Leistungsaufnahme. Odendahl: »Im Fahrzeug beispielsweise richtet sich die Optimierung darauf, die Wärmeentwicklung im Chip möglichst gering zu halten. In Basisstationen geht es wiederum darum, die Leistungsaufnahme zu reduzieren.«

Und dann stellt sich noch die dritte Frage, die die Entwickler vor eine Herausforderung stellt: Welche Multi-Core-Plattform ist die beste für den Code? Welcher AI-Chip ist optimal für ein neuronales Netz? Heute könne man versuchen, diese Fragen mithilfe von Excel-Tabellen zu lösen oder sich auf die Aussage eines erfahrenen Ingenieurs verlassen, der solche Aufgaben schon seit vielen Jahren gelöst hat. Aber mit komplexer werdenden Applikationen und heterogenen Supercomputern sei dieser Ansatz nicht mehr zielführend.

Deshalb hat Silexica mit SLX eine Tool-Chain entwickelt, die mithilfe von Compiler-Technologien die Software automatisiert auf die Hardware verteilt. Was vielleicht einfach klingt, hat es in sich, denn: »Es gibt sehr viele verschiedene Hardware-Plattformen, verschiedene Programmiermodelle und viele verschiedene Applikationen. Und es ist ein Riesenunterschied, ob man Code für ein FPGA, eine GPU entwickelt oder Autosar-Classic-Code für eine ASIL-D-Anwendung programmiert«, so Odendahl weiter. Deshalb hat Silexica verschiedene Flows entwickelt, welche aber alle drei Schritte gemeinsam haben:

  • Der Code wird statisch und dynamisch analysiert, der Kunde muss kein Modell in Excel manuell erstellen und optimieren. Odendahl: »Das Tool versteht den Code, es weiß, wie er auf einer gegebenen Hardware läuft, wie viele Daten wann übertragen werden, und all das passiert automatisch mit unserer Compiler-Technik. Basierend auf diesem Durchlauf wird eine große Grafik der Applikation erstellt.«
  • Die Verteilung des Codes auf die Hardware. Odendahl hält es für eine Optimierung für absolut notwendig, dass die zugrunde liegende Hardware als XML-Beschreibung vorliegt. Mit dieser Hardware-Beschreibung und der erstellten Applikationsbeschreibung lassen sich dann Parallelisierungsmöglichkeiten finden und die Applikation kann auf die verschiedenen Recheneinheiten verteilt werden. »Mit dem Tool lässt sich nicht nur sagen, welcher Teil der Applikations-Software auf welcher Recheneinheit laufen soll, sondern es kann auch die Ausnutzung der Recheneinheit bzw. der gesamten Architektur vorhersagen. Das Tool kann auch bestimmen, welcher Buffer in welchem Speicher liegen soll, was in lokalem Speicher gespeichert und was in externem Speicher abgelegt werden soll«, so Odendahl. Heute werde das typischerweise manuell durchgeführt; mit SLX lässt sich das automatisieren.
  • Im dritten Schritt kann automatisch neuer Code erzeugt werden, das Tool kann Hinweise darauf geben, welche Funktionen umgeschrieben werden müssen, oder Updates in Konfigurationsdateien durchführen.