Intel C++-Compiler und VTune für Linux

25.05.2004 von Mike Hartmann
Niemand kennt die kleinen Geheimnisse der Intel-CPUs so gut wie der Hersteller selbst. Daher verwundert es wenig, dass Intel auch für Linux eigene Compiler im Portfolio hat, die einen hoch optimierten Code erzeugen.

Der Intel C++-Compiler für Linux ist seit kurzem in der Version 8.0 verfügbar und bietet eine Reihe von Neuerungen. Zu den inhaltlichen und technischen Neuerungen zählen unter anderem eine Unterstützung für Prescott-Prozessoren, vorkompilierte Header-Dateien, um spätere Compiler-Läufe zu beschleunigen, und eine bessere Kompatibilität mit gcc.

Intel stellt die Linux-Version des Compilers für nicht kommerzielle Zwecke kostenlos zur Verfügung. Sie müssen lediglich an einer kurzen Umfrage teilnehmen und Ihre E-Mail-Adresse angeben, um den Freischalt-Code zu bekommen. Die Windows-Variante schlägt weiterhin mit knapp 440 Euro zu Buche. Im Paket sind jeweils eine IA32- und eine Itanium-2-Variante für das jeweilige Betriebssystem enthalten.

Diesen Artikel und eine ganze Reihe weiterer Praxis-Themen finden Sie auch in unserem neuesten tecCHANNEL-Compact. Dort erfahren Sie nicht nur, wie Sie einen Apache 1.x unfallfrei auf Apache 2 upgraden, sondern unter anderem auch wie Sie einen Email-Server mit dem Freeware-Tool XMail aufsetzen und via SpamAssassin vor unerwünschten Mails schützen. Auf der Heft-CD finden Sie einen kompletten LAMP-Server von SuSE sowie den Intel C++-Compiler für Linux, mit dem Sie Ihre Programme optimal auf Ihre Prozessor-Architektur abgestimmt compilieren können. Der Compiler ist für den Privatgebrauch sogar kostenlos. Das Compact können Sie hier in unserem Online-Shop für 9,90 Euro versandkostenfrei bestellen.

Intel C++-Compiler für Linux

IA-32-Architektur

Systemvoraussetzungen

Kernel

2.4.x

glibc

2.2.5, 2.2.93 oder 2.3.2

Hardware

Prozessor

ab PII, 450 MHz

RAM

128 MByte

Festplatte

100 MByte

Itanium 2

Systemvoraussetzungen

Kernel

2.4.x

glibc

2.2.4, 2.2.5 oder 2.3.2

binutils

2.12, 2.14 dringend empfohlen

Hardware

Prozessor

Itanium oder Itanium 2

RAM

512 MByte, deutlich mehr bei aufwendigen Optimierungen

Festplatte

150 MByte

Installation und Verwendung

Das knapp 64 MByte große Paket können Sie sich von der Intel-Website herunterladen oder gleich von der Compact-CD kopieren. Sie benötigen lediglich noch den Lizenzschlüssel, den Sie hier anfordern können und als Attachment per E-Mail erhalten.

Diese Lizenzdatei kopieren Sie nach /opt/intel/licenses, ansonsten unterbricht das Installations-Script mit einer Frage nach dem Speicherort der Datei. Das gezippte Tarball entpacken Sie in ein temporäres Verzeichnis und starten dann ./install.sh, um die eigentliche Installation anzustoßen. Je nach Prozessor wählt das Script das richtige RPM aus und richtet es auf dem System im Verzeichnis /opt/intel_cc_80/ ein.

Ein erster Test mit dem Apache-Webserver soll zeigen, dass der Compiler richtig installiert ist. Holen Sie sich dazu zunächst den Sourcecode von www.apache.org und entpacken Sie das gezippte Tarball in ein Verzeichnis.

gunzip httpd-<version>
tar -xf httpd-<version>

Damit der Intel-Compiler funktioniert, benötigt er einige Umgebungsvariablen. Diese lassen Sie am besten automatisch vom mitgelieferten Script setzen:

source /opt/intel_cc_80/bin/iccvars.sh

Im nächsten Schritt gilt es, den Build-Vorgang für den Apache zu konfigurieren. Dazu dient das Script configure im Source-Verzeichnis von Apache. Das Script entnimmt einige Informationen aus Umgebungsvariablen, so zum Beispiel den zu verwendenden Compiler (CC) und die passenden Startoptionen (CCFLAGS). Danach reichen Aufrufe von make undmake install, um den neu kompilierten Webserver zu installieren.

cd httpd-<version>
CC="icc" CCFLAGS="-O3 -xN -tpp7" ./configure
make
make install

Ein anschließender Aufruf von

/usr/local/apache2/apachectl start &

und ein Laden der URL http://localhost mit einem Browser überprüfen, ob alles wie gewünscht funktioniert hat. Die verwendeten Kommandozeilen-Parameter in CCFLAGS weisen den Compiler an, aggressive Optimierungen zu verwenden (-O3), speziellen Code für Pentium 4 zu erzeugen (-xN) und Optimierungen für Pentium 4 vorzunehmen (-tpp7). Der Parameter -xN sorgt dafür, dass das erzeugte Binary nur auf P4-Systemen läuft.

Wenn Sie stattdessen -axN angeben, generiert der Compiler im Zweifelsfall eine generische IA-32-Funktion und eine speziell auf P4 angepasste. Dadurch wird allerdings das Binary größer und etwas langsamer, weil jeweils auf die Prozessorarchitektur geprüft wird, bevor eine entsprechende Funktion aufgerufen wird. Weitere Möglichkeiten für die Schalter -x und -ax sind k für Pentium III, B für Pentium-M und P für Prescott-Systeme.

Erweiterte Features

Bei einer Reihe von Optimierungen, etwa hinsichtlich Schleifen, kann der Compiler nur Annahmen treffen. Hier können Sie entweder mittels spezieller pragma-Anweisungen im Sourcecode Hilfestellung geben oder mittels der so genannten "Profile Guided Optimization" (PGO) noch ein weiteres Quäntchen Performance herauskitzeln.

Bei Ersterem teilen Sie beispielsweise dem Compiler mittels der Anweisung

#pragma loop count (n)

mit, dass die folgende Schleife wahrscheinlich n-mal durchlaufen wird. Das vereinfacht dem Compiler die Optimierungsarbeit.

Die Optimierung per PGO ist ein mehrstufiger Prozess. Hier wird zunächst ein spezielles Binary erzeugt, das Informationen über Häufigkeit von Funktionsaufrufen, Schleifendurchläufen oder Ähnlichem mitprotokolliert. Dazu ist das Programm mit dem Schalter -prof_gen zu kompilieren und dann mit einem typischen Datensatz zu durchlaufen. Danach kann man das endgültige Binary unter Einbeziehung der gewonnenen Informationen mit dem Schalter -prof_use erzeugen. Über das Tool profmerge lassen sich auch Messungen mit einer Reihe von verschiedenen Datensätzen machen, die dann zusammen für die Optimierung hinzugezogen werden.

VTune für Linux

Schlechten Code kann auch der beste Compiler nur bedingt in ein schnelles Executable verwandeln. Doch eines der größten Probleme beim Optimieren von eigenen Entwicklungen besteht darin, die eigentlichen Flaschenhälse herauszufinden. Denn was nutzt es, beispielsweise Stunden in eine Funktion zu investieren, die gerade mal einen Bruchteil der gesamten Programmlaufzeit ausmacht?

Bei diesem Problem hilft Intels VTune. Es überwacht den Ablauf eines Programms und sammelt dabei Daten darüber, wie viel Zeit in den jeweiligen Unterroutinen oder Bibliotheken verbraucht wird. Anhand dieser Daten kann der Entwickler dann ermitteln, wo sich eine Optimierung am meisten lohnt. Billig ist das jedoch nicht: Intel veranschlagt 699 US-Dollar für das Produkt (als Box oder als Lizenz-Key), der deutsche Distributor sogar knapp 810 Euro für den reinen Lizenzschlüssel (834 Euro für eine Box). Angesichts des derzeit günstigen Dollar-Kurses ist das ein starkes Argument für eine Online-Bestellung bei Intel.

Bei der Evaluierungs-Version von VTune gibt sich Intel restriktiver als beim Compiler: Es gibt keine freie Version für den nicht kommerziellen Einsatz, und die maximale Testzeit ist auf sieben Tage beschränkt.

Intel VTune for Linux

IA-32-Architektur

Systemvoraussetzungen

Distribution SuSE

8.1, 8.2, 9, SLES 8

Distribution Red Hat

7.2, 7.3, AS 2.1, ES 2.1, WS 2.1

Hardware

Prozessor

ab PII, 450 MHz

RAM

128 MByte

Festplatte

216 MByte

Itanium 2

Systemvoraussetzungen

Distribution SuSE

SLES 8

Distribution Red Hat

AS 2.1, ES 2.1, WS 2.1

Hardware

Prozessor

Itanium oder Itanium 2

RAM

128 MByte

Festplatte

243 MByte

Installation und Betrieb

Solange Ihr System den von Intel geforderten Voraussetzungen hinsichtlich Distribution und Kernel-Version entspricht, gestaltet sich die Installation sehr einfach. Sie müssen lediglich die per E-Mail erhaltene Lizenzdatei in das Verzeichnis /opt/intel/licenses kopieren, das tar-Archiv auspacken und ./install starten. Wählen Sie die Komplettinstallation und folgen Sie den weiteren Schritten im Script. Die ausführbaren Dateien von VTune finden Sie im Verzeichnis /opt/intel/vtune/bin.

Verfügen Sie nicht über die richtige Distribution oder Kernel-Version, empfiehlt Intel, das Produkt nicht zu installieren. Optional kann man versuchen, den benötigten VTune-Kernel-Treiber selbst zu kompilieren und einzubinden. Dieser Treiber wird auch benötigt, um systemweite Performance-Daten zu sammeln und somit generelle Probleme und Flaschenhälse aufzuspüren.

Für einen ersten Test analysieren wir das Leistungsverhalten von gzip. Dazu benötigen Sie den Quellcode, den Sie am besten von www.gzip.org herunterladen. Diesen kompilieren Sie mit der Option -o, damit Debug-Informationen in die ausführbare Datei geschrieben werden. Den Analyselauf starten Sie mit

vtl activity -c callgraph -app ./gzip,"-9 -v <dateiname>" -moi ./gzip run

Ersetzen Sie dabei <dateiname> durch den Namen einer zu komprimierenden Datei. VTune legt nun die Performance-Daten ab und zeigt die Ergebnisse später mit dem Befehl vtl view an. Beispielsweise erhalten Sie mit dem Parameter -modules eine Liste aller beteiligten Module und Libraries. Der Parameter -functions liefert eine Auflistung aller Funktionen inklusive der dazu ermittelten Werte.

Die Ausgabe auf dem Bildschirm ist allerdings nicht gut lesbar, daher empfiehlt es sich, die Ausgabe in eine Datei umzuleiten und dann mit einer Tabellenkalkulation zu öffnen.

vtl view -functions > dateiname.csv

Dort können Sie dann beispielsweise nach der Spalte "SELF_TIME" sortieren, um festzustellen, in welcher Funktion die meiste Zeit verbraucht wurde. Der Parameter -calls schließlich listet für eine oder alle Funktionen auf, welche weiteren Funktionen wie oft von dieser aufgerufen werden und wie viel Zeit darin verbraucht wird.

Fazit

Das Gespann C++-Compiler und VTune bietet eine gute Möglichkeit, schnelle Applikationen für Linux zu entwickeln - allerdings zu Lasten der Plattformunabhängigkeit. Bei der Entwicklung von eigenen Programmen für den Haus- oder Firmengebrauch spielt das jedoch keine besondere Rolle, solange die Strategie der IT-Abteilung heißt: "Wir kaufen nur Intel!"

VTune, das nur in einer kommerziellen Variante verfügbar ist, zielt direkt auf professionelle Programmierer - wie schon der Preis zeigt. Dementsprechend ist es in anderen Umgebungen auch verzichtbar.

Der C++-Compiler dagegen eignet sich auch für andere Anwendungszwecke. So ließe sich beispielsweise ein Linux aufsetzen, das optimal auf den jeweiligen Prozessor des Servers abgestimmt ist. Das einzige Problem dabei: Der Kernel lässt sich nicht so ohne Weiteres mit dem Intel-Compiler übersetzen. Obwohl der Compiler schon seit der Version 7 für den nicht kommerziellen Einsatz kostenlos ist, hat sich bisher noch niemand gefunden, der die Quellcodes und Makefiles darauf anpasst. Zumindest Apache, MySQL und eine Vielzahl anderer (Server-)Anwendungen lassen sich ohne großen Aufwand damit übersetzen und optimieren. (mha)