Open Source im professionellen Einsatz

GNU Compiler Collection 4.0

Wettrennen

Ein Jahr nach Version 3.4 erscheint GCC 4.0 mit einer neuen internen Struktur, die künftige Verbesserungen vorbereitet, aber jetzt schon Ergebnisse zeigt: Der Compiler vektorisiert C-Code automatisch und übersetzt C++-Programme schneller als sein Vorgänger.

Lange erwartet - jetzt ist es endlich so weit: Die GNU Compiler Collection [1] bricht in eine neue Ära auf und liegt nun in Version 4.0 vor. Wichtigstes neues Feature ist zweifellos die Optimierungsinfrastruktur der Static Single Assignment Trees (Tree-SSA, [2]). Dieses Modell zur internen Code-Repräsentation hat den Aufbau der GCC stark beeinflusst. Deshalb entschlossen sich die Entwickler, dies auch in der Version auszudrücken, und sprangen gleich zur 4.0, ursprünglich war die Release noch als 3.5 geplant. Eine Übersicht der Änderungen gibt das Changes-Dokument [3].

Einfachere Struktur durch Single Assignments

Frühere GCC-Versionen wandten die Optimierungsschritte hauptsächlich auf die interne Abstraktion der Maschinensprache an, also auf die RTL-Repräsentation (Register Transfer Language), eine Zwischenstufe der Kompilierung. Allerdings sind zu diesem Übersetzungszeitpunkt schon viele Informationen der Hochsprache verloren. In der aktuellen GCC-Version stehen sie durch die Tree-SSA-Darstellung für die Optimierung zur Verfügung. Dazu baut der Compiler intern einen Graphen auf, dessen Knoten nur eine einzige Zuweisung enthalten (Single Assignment). So entsteht aus »a = b + c - d« Compiler-intern:

tmp = b + c
a = tmp - d


Dadurch werden die Ausdrücke einfacher und sind algorithmisch besser zu verarbeiten. Da die Tree-SSA-Repräsentation wesentlich mehr Informationen enthält als die RTL-Variante vorheriger Versionen, können die GCC-Entwickler damit neue, moderne Optimierungstechniken implementieren.

Einige der Optimierungen in 4.0 setzen direkt auf der SSA-Ebene an. Erst dadurch wurde die Vektorisierung von Schleifen möglich (siehe Kasten "Automatische Vektorisierung"). Vor allem C++-Programmen soll der Compiler damit in Zukunft deutlich beschleunigen. GCC 4.0 bildet in erster Linie die Basis für künftige Verbesserungen, die in Version 4.1 folgen sollen.

Parallel rechnen

Unter Vektorisierung ist bei der GCC die Verwendung der SIMD-Instruktionen (Single Instruction Multiple Data) moderner CPUs zu verstehen. In der x86-Welt sind dies MMX [4], 3DNow [5] und SSE [6] mit den Revisionen 2 und 3 [7]. Jenseits des Mainstream finden sich bei PowerPC der Altivec-Mechanismus [8] und bei Sparc-Prozessoren das Sun-eigene VIS (Visual Instruction Set) [9]. Auch bei den ARM- [10] und Super-H-Prozessoren [11] sind solche Befehle zu finden, die teilweise sogar schon von der GCC-Version 4.0 genutzt werden.

Welche Arten für die jeweilige Architektur implementiert sind, zeigt Tabelle 1. Die einzelnen Spalten geben an, welche Vektoroperationen für wie viele Elemente (4 bis 16) eines Typs (Integer oder Float) realisiert sind.


Als weitere Neuerung integriert GCC 4.0 das Frontend für die Sprache Fortran 95, die das etwas angegraute Fortran 77 ablöst. Im wissenschaftlichen Bereich ist Fortran noch häufig im Einsatz, auch die Spec-Benchmarks enthalten einige Fortran-95-Tests, die GCC bisher nicht übersetzen konnte.

Nicht mehr in die neue Release 4.0 hat es der Dialekt Objective-C++ geschafft. Dabei handelt es sich um eine Mischung von C++ mit dem von Apple verwendeten Objective-C.

Für C++-Entwickler dürfte interessant sein, dass der neue Compiler ohne Optimierungen (»-O0«) deutlich schneller arbeitet als alle vorherigen Versionen. Das kann den Editier-Compile-Zyklus deutlich beschleunigen, dessen Dauer die C++-Entwicklung mit der GCC bisher eher mühsam gestaltete.

Die C++-Bibliothek bringt auch schon einige Features aus der kommenden Überarbeitung des C++-Standards mit. Der Namensbereich »TR1« enthält bereits »hashtable«, »tuple«, »type_traits«, »shared_ptr« und einiges mehr. Entwickler können sich so mit den Erweiterungen beschäftigen, bevor sie im nächsten C++-Standard erscheinen.

Das Debugging erleichtern die neuen Location Lists, die der neue GCC-Compiler in die Objektdateien einfügen kann. Diese führen über den Ort der verwendeten Variablen Buch und helfen damit dem GNU-Debugger dabei, auch bei optimiertem Code die passende Zeile im Quellcode wiederzufinden. Bisher war das nicht möglich, sodass man zum Debuggen weniger optimierten Code generieren musste,siehe [12]. Abschalten lässt sich dieses Verhalten mit dem Parameter »-no-var-tracking«.

Diesen Artikel als PDF kaufen

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook