Für eine korrekte Darstellung dieser Seite benötigen Sie einen XHTML-standardkonformen Browser, der die Darstellung von CSS-Dateien zulässt.

GNU Compiler Collection Version 4.2

Die neueste Version der GNU Compiler Collection (Version 4.2) wurde auf dem Cluster installiert. Die Binaries liegen unter /usr/local/gcc-4.2/bin. Die von der Distribution bereitgestellte Version 3.3.3 (aus 2003) ist weiterhin nutzbar.

Der Compiler unterstützt mehreren Sprachen wie C/C++ (gcc/g++), Fortran (gfortran), Java (gcj) und Ada (gnat). Zu den Neuerungen gegenüber Version 3.3.3 zählt die wesentlich verbesserte Unterstützung der ANSI/ISO/DIN C++ Standards und die Optimierung für die Opteron-Plattform (siehe unten).

Insbesondere wird ab Version 4.2 die Multi-Threading Entwicklung mittels OpenMP (libgomp) unterstützt. Source-Codes werden dazu mit speziellen #pragma Anweisungen erweitert und beim Übersetzen muß das Flag '-fopenmp' verwendet werden. Das erzeugte Executable wird dann automatisch mit mehreren Threads ausgeführt (dazu sollte die Umgebungsvariable OMP_NUM_THREADS gesetzt werden) -- etwa wird eine Schleife dann nicht mehr seriell abgearbeitet, sondern parallel, soweit der Programmierer das erlaubt.

Die neuen Compiler unterscheiden sich von den alten GNU Compilern der Distribution durch das Suffix "-4.2" (z.B g++-4.2 oder gcc-4.2). Die Version 3.3.3 ist natürlich weiterhin installiert und wie gewohnt nutzbar.


$ cat hallowelt.c
#include <omp.h>
#include <stdio.h>

int main (int argc, char *argv[]) {
int id, nthreads;

#pragma omp parallel private(id)
{
id = omp_get_thread_num();
printf("Hello World from thread %d\n", id);
#pragma omp barrier
if ( id == 0 ) {
nthreads = omp_get_num_threads();
printf("There are %d threads\n",nthreads);
}
}
return 0;
}

Beim Übersetzen bietet es sich nun grundsätzlich an, die Opteron-Optimierung einzuschalten:


$ /usr/local/gcc-4.2/bin/gcc-4.2 -Wall -Werror -fopenmp -O3 -mtune=opteron \
-mcpu=opteron -o hallowelt hallowelt.c


$ ldd hallowelt
libgomp.so.1 => /usr/local/gcc-4.2/lib64/libgomp.so.1 (0x0000002a9566d000)
libpthread.so.0 => /lib64/tls/libpthread.so.0 (0x0000002a95774000)
libc.so.6 => /lib64/tls/libc.so.6 (0x0000002a95889000)
librt.so.1 => /lib64/tls/librt.so.1 (0x0000002a95ab0000)
/lib64/ld-linux-x86-64.so.2 (0x0000002a95556000)

$ OMP_NUM_THREADS=2 ./hallowelt
Hello World from thread 0
Hello World from thread 1
There are 2 threads

$ OMP_NUM_THREADS=5 ./hallowelt
Hello World from thread 2
Hello World from thread 1
Hello World from thread 3
Hello World from thread 4
Hello World from thread 0
There are 5 threads

Die Dokumentation ist /usr/local/gcc-4.2/man/man1 bzw. /usr/local/gcc-4.2/info einsehbar. Z.B.:

 

$ man -l /usr/local/gcc-4.2/man/man1/g++-4.2.1

oder
$ info -f /usr/local/gcc-4.2/info/gcc.info


Hinweis: Die Compiler liegen zur Zeit noch nicht im Suchpfad. Es muß also, wie oben gezeigt, der vollständige Pfad beim Aufruf übergeben werden. Bei denen durch die Autotools erzeugten configure-Scripts kann ein Aufruf folgendermaßen aussehen:


$ CXX=/usr/local/gcc-4.2/bin/g++-4.2 CC=/usr/local/gcc-4.2/bin/gcc-4.2 ./configure


alternativ:
$ export CFLAGS="-Wall -O3 -mtune=opteron -mcpu=opteron"
$ export CXXFLAGS=$CFLAGS
$ export CXX=/usr/local/gcc-4.2/bin/g++-4.2
$ export CC=/usr/local/gcc-4.2/bin/gcc-4.2
$ ./configure

Informationen zu OpenMP / libgomp:

http://www.openmp.org/
http://en.wikipedia.org/wiki/OpenMP
http://gcc.gnu.org/projects/gomp/

Bei Fragen und Problemen:

Atya Elsheikh <elsheikh@simtec.mb.uni-siegen.de >

Michael Weitzel <weitzel@simtec.mb.uni-siegen.de >