ICSE: Coding von Multi-Core-Prozessoren
» Von , 04.06.2012 16:03.
Der kommunikative Overhead zwischen den Threads kann einerseits den Performance-Gewinn eines optimierten Programms glatt zunichte machen, ist aber andererseits dringend notwendig. Zum Beispiel, um die gefürchteten Deadlocks zur vermeiden: zwei parallel laufende Software-Komponenten blockieren sich gegenseitig, die gesamte Programmausführung stoppt. Pankratius verweist auf das sogenannte Producer-Consumer-Pattern, eine weitere Erfolgsstrategie der parallelen Software-Entwicklung. Das Szenario: Ein Producer legt Elemente in einem Buffer ab, der x Elemente speichern kann. Ein Consumer entnimmt Elemente aus dem Puffer. Producer und Consumer takten in der Regel nicht synchron.
Java: Deadlocks verhindern
Ist nun der Buffer voll und der Producer am Zug, stockt die Programmausführung, denn der Producer kann kein neues Element in den Puffer legen (der ist ja schon voll). Durch Kommunikation zwischen beiden Komponenten, in Java durch die Funktion notifyAll(), lässt sich der Deadlock elegant vermeiden:
Der Producer wartet, bis im Puffer eine Position frei wird, addiert ein Element und benachrichtigt danach alle Consumer-Threads:
synchronized void post (Work w) {
while (queue.isFull())) {this.wait(); }
queue.add(w);
this.notifyAll(); }
Der Consumer wartet, bis der Puffer mindestens ein Element enthält, entnimmt dieses und benachrichtigt danach alle Producer-Threads:
synchronized Work get () {
while (queue.isEmpty()) {this.wait(); }
queue.remove();
this.notifyAll(); }
Chip-Produzenten wie Intel oder AMD rät Pankratius, bei aller Parallelisierung den herkömmlichen sequentiellen Code nicht zu vergessen. Die Zukunft liege im optimierten, hybriden Chip-Design. Denn Software ist immer nur bis zu einem gewissen Grad parallelisierbar; bestimmte Sourcecode-Anteile verlangen zwingend nach einer sequentiellen Bearbeitung. Sind dann 47 von 48 Prozessorkernen auf Parallelcode optimiert, dann lastet die sequentielle Abarbeitung auf einem einzigen Prozessorkern, und das ist definitiv zu wenig.
Punkto parallele Software-Entwicklung hält der Software-Papst zwei Trends für wegweisend: Offline-Tuning, wo der Programmierer performancerelevante Parameter vorgibt und ein in das Betriebssystem (OS) integriertes Auto-Tuning, welches das OS zur Laufzeit der Software selbst vornimmt.




KOMMENTARE
KOMMENTAR SCHREIBEN