New challenges in software development for modern multi-core systems

I am currently applying at different universities for a master in computer science. Everybody who has applied to a university knows that this is a horribly annoying thing to do. Every university has a different web form; most additionally want documents in paper; and some think clicking through a million different web sites in order to apply for the correct courses is still not enough effort to show that you really want to study at this specific university. The technical university of munich (TU München) for example asks candidates to write a 1000 words essay about one of four topics. Here is something I learned writing this essay: There is nothing more enjoyable than typing 1000 words about multi-core systems into your phone while sitting at a beach in Cuba.

The essay is written in German and talks about “New challenges in software development for modern multi-core systems”.

 

Gordon Moore beschrieb in seiner Arbeit „Cramming more components onto integrated circuits“ bereits 1965 eine Gesetzmäßigkeit, die heutzutage als „Moore’s Law“ bekannt ist. Moore’s Law besagt, dass sich die Anzahl der integrierten Schaltkreise pro Flächeneinheit alle zwölf Monate verdoppeln werde. Moore selbst korrigierte seine Aussage zehn Jahre später und sagte voraus, dass der Zeitraum für die Verdoppelung etwa 24 Monate betragen würde. Bis vor wenigen Monaten, als große Chiphersteller wie Intel und AMD zukünftige strategische Entwicklungen präsentierten, galt Moore’s Law als selbsterfüllende Prophezeiung.
Bis in die frühen 2000er Jahre verfolgten Computernutzer ein Wettrennen der Taktraten einzelner Prozessoren. Die Hersteller warben mit immer höheren Zahlen, die zuletzt bis zu mehreren Gigahertz reichten. Moore’s Law ließ sich jedoch nicht durch das simple Skalieren der Taktraten erfüllen. Physikalische Grenzen, wie beispielsweise große Abwärme der Prozessoren, machten das weitere Skalieren unrentabel.
Ab 2006 begannen Mehrkernprozessoren den PC-Markt zu dominieren. Diese Mikrochips mit mehreren Hauptprozessorkernen erlaubten es, bestimmte Anwendungen zu parallelisieren und somit die Leistung der Recheneinheit zu erhöhen, während die Taktraten der einzelnen Prozessorkerne gering gehalten und somit Auffälligkeiten gegenüber physikalischen Effekten verringert wurden.
Mit der Einführung der zunächst Zwei-, später Vier- oder Achtkernprozessoren ergaben sich nicht nur für die Elektronik neue Herausforderungen. Software, die von einem Prozessor mit hoher Taktrate profitiert hatte, war nicht zwangsläufig für den Mehrkernbetrieb geeignet. Einige Algorithmen, wie beispielsweise Quicksort, profitierten von der Möglichkeit, mehrere Berechnungen parallel durchzuführen. Andere Algorithmen wie beispielsweise das Gauß-Seidel-Verfahren waren konzeptionell nicht in der Lage, eine parallele Berechnung durchzuführen und hatten somit einen entscheidenden Nachteil. Die Parallelisierbarkeit wurde ein neues Kriterium für die Effizienz eines Algorithmus.
Neben der Möglichkeit, die Effizienz von Algorithmen zu beeinflussen, stellten sich der Informatik auch weitere Herausforderungen. Das Philosophenproblem beschreibt ein Fallbeispiel der theoretischen Informatik über das Thema Verklemmung, welches Edsger W. Dijkstra bereits 1971 formulierte. Hierbei sitzen fünf Philosophen an einem Tisch mit fünf Nudelgerichten und fünf Gabeln. Die Philosophen können entweder Philosophieren oder Essen, jedoch nicht beides gleichzeitig. Zum Philosophieren benötigen sie keine Gabel, zum Essen jedoch zwei. Will ein Philosoph essen, so versucht er, sich zwei Gabeln zu nehmen und wartet, falls ihm keine zwei Gabeln zur Verfügung stehen. Beschließen alle fünf Philosophen gleichzeitig, dass sie zu essen beginnen wollen, kann es passieren, dass sich jeder Philosoph genau eine Gabel nimmt und bemerkt, dass er auf die zweite Gabel warten muss. Zu diesem Zeitpunkt sind alle Philosophen in einem niemals endenden wartenden Zustand, der im Allgemeinen als „Verklemmung“ bezeichnet wird.
Die Verklemmung ist nur eine der Herausforderungen, die durch den Einsatz von Mehrkernsystemen entstehen. Das Philosophenproblem beschreibt gleichzeitig ein Problem gemeinsam genutzter Ressourcen.
Versuchen mehrere Prozesse oder Threads auf dieselben Ressourcen zuzugreifen, muss der Zugriff synchronisiert werden. Ohne eine Synchronisierung kann es zu Problemen wie dem “dirty-read” kommen. Hierbei versucht ein Prozess einen im Speicher liegenden Wert zu lesen, während ein anderer Prozess diesen Wert ändert. Unter bestimmten Umständen kann es hierbei dazu kommen, dass ein Prozessor den Prozesskontext ändert, nachdem der im Speicher liegende Wert lediglich zum Teil verändert wurde. Dann versucht der zweite Prozess, diesen zum Teil veränderten Wert zu lesen. Dies führt in den meisten Fällen zu undefiniertem Verhalten. Das Manipulieren von gemeinsam genutzten Daten sollte daher nicht durch eine Kontextänderung unterbrochen werden (atomare Operation). Alternativ sollte der lesende Prozess auf die vollständige Fertigstellung der Manipulation warten. Dies wird in der Regel durch Mutexe oder Semaphoren bewerkstelligt. Hierbei ist zu beachten, dass es durch unoptimierte Prozesssynchronisation zu großen Leistungseinbußen kommen kann.
IBM stellt mit der Z13 Serie ihrer Mainframesysteme heutzutage eines der größten Mehrkernsysteme der Welt her. Bis zu 168 Prozessoren mit einer Taktrate von bis zu 5 Gigahertz können in diesen Industriemaschinen parallel rechnen. Diese millionenschweren Rechner werden von Großunternehmen wie der Fiducia AG verwendet, um Großkunden hochkarätige I/O-bezogene Anwendungen möglichst effizient bereitstellen zu können. Andere Unternehmen benutzen für solche Anwendungen eine andere Strategie. Große Internetkonzerne wie Facebook und Google können ihre Kunden nicht mit einem oder wenigen Großrechnern mit ihrer Software versorgen. Stattdessen wird die Rechenlast nicht auf mehrere Prozessorkerne, sondern mehrere Rechner verlagert. Durch geschickte Lastverteilung können Kundenanfragen hochparallel und für den Kunden transparent auf Rechnern auf der ganzen Welt verarbeitet werden. Dies bietet einerseits den Vorteil, dass die Kosten pro Recheneinheit deutlich reduziert werden, wirft jedoch andererseits neue Probleme bei der Synchronisation unterschiedlicher Berechnungen auf. Traditionelle SQL-basierte relationale Datenbanksysteme sind für diese Anwendung meist ungeeignet. Stattdessen wird vermehrt auf verteilte NoSQL-Systeme wie beispielsweise MongoDB gesetzt.
Durch das Umsatteln von Großrechnern auf verteilte Systeme können hohe Kosten gespart werden. Zusätzlich bietet diese Lösung in vielen Fällen andere Vorteile, wie eine erhöhte Redundanz. Häufig genutzte Ressourcen können auf mehreren Rechnern vorhanden sein um Verklemmungen und anderen Synchronisationsproblemen vorzubeugen. Dennoch lassen sich nicht alle Probleme durch Neuverteilung der Rechenlast lösen. Das Cachen von Daten stellt hierbei beispielsweise ein Synchronisationsproblem aller verteilten Systeme dar, welches bis heute nicht vollständig gelöst werden konnte. Auch in Zukunft wird es durch Veränderung der Kundenanforderungen immer weitere Aufgaben geben, die die Informatik zu lösen hat.

Leave a comment