next up previous
Next: Maple für StudentINNen Up: Software Previous: Anzeige verfügbarer Ressourcen

BLAS-Routinen unter Linux

Für grundlegende Vektor- und Matrix-Operationen werden seit langem die BLAS-Routinen (``Basic Linear Algebra Subroutines'') eingesetzt. Die Idee, damit einen Standard zu schaffen, den die Hersteller möglichst effizient auf ihren eigenen Maschinen implementieren, hat sich längst bewährt: Auf fast allen Architekturen sind sehr schnelle BLAS-Implementierungen verfügbar, die in der Regel in Assembler handoptimiert wurden. Unter HP-UX gibt es z.B. die veclib, die ausnehmend gute Ergebnisse bringt.

Eine Ausnahme bildeten lange die PCs. Mit dem Engagement in der amerikanischen Höchstleistungsrechner-Initiative (ASCI) hat Intel inzwischen sein Herz für numerische Software entdeckt und liefert mit der ``Intel® Math Kernel Library'' u.a. eine schnelle BLAS-Version für Windows-Betriebssysteme. Mittlerweile existiert auch eine Portierung auf Linux, die unter http://www.cs.utk.edu/~ghenry/distrib/ allgemein zur Verfügung gestellt wird. Allerdings muss sich jeder Interessierte selbst dort registrieren, eine Weitergabe der Bibliothek, etwa durch das RZ, ist nicht gestattet. Auf dem Linux-Pool des RZ, der gerade geplant wird, wird sie aber zur Verfügung stehen können.

Übrigens sollte man diese BLAS-Bibliothek nicht mit der BLAS-Version verwechseln, die an der Netlib-Bibliothek im Sourcecode frei verfügbar ist (unter http://elib.zib.de/netlib/blas/index.html) ! Hierbei handelt es sich um eine Referenz-Version, die auf jedem System übersetzt werden kann, aber natürlich bei weitem nicht die Leistung der handoptimierten Version erreicht.

Zum schnellen Test einer BLAS-Installation mag das folgende kleine C-Programm dienen, das die Routine DGEMM zur Multiplikation doppeltgenauer Matrizen verwendet:

#include <stdio.h>
#define N   1000

int main(int argc, char* argv[]) {
  double   a[N][N], b[N][N], c[N][N];
  int      i,j,k;
  int      n     = N;
  char     trans = 'N';
  double   alpha = 1.0;
  double   beta  = 0.0;
  
  /* Anfangswerte setzen */
  init(a, b);
  
  /* Matrixmultiplikation */
  dgemm_(&trans, &trans, &n, &n, &n, &alpha, b,
             &n, a, &n, &beta, c, &n);

  /* Testdaten ausgeben */
  test(c);
}

Vollständige Versionen in C und Fortran findet man auf den RZ-WWW-Seiten.

Die folgenden Zeitmessungen für eine einfache 1000x1000-Multiplikation per Hand bzw. mit BLAS wurden auf einem PentiumII/400MHz-System unter Suse-Linux 6.2 gemessen. Zum Vergleich dienen die Werte der Orion, einer HP V-Class mit HPPA 8200/240MHz-Cpus. Dabei wurde jeweils ohne Optimierung, mit -O3 (bzw. +O3 auf orion) und mit der BLAS-Routine gerechnet; alle Zeiten sind in Sekunden:

Rechner ohne Opt. -O3 blas
pc 345.5 76.8 7.6
orion 279.3 70.7 2.9

Diese Ergebnisse zeigen, dass die BLAS-Routinen für ernsthafte numerische Anwendungen unverzichtbar sind und man jeden Mitarbeiter auf die Schulbank schicken sollte 1, der immer noch die Matrixmultiplikation mit drei Schleifen selbst programmiert!

Man erkennt übrigens auch, dass die hohe Leistung der HP-Prozessoren vom Compiler selbst bei einer Matrixmultiplikation nicht erreicht wird. Dies hängt an einer schlechten Ausnutzung der CPU-Register. HP hat für die Zukunft Verbesserungen in Aussicht gestellt - wir werden sehen. In jedem Fall zeigt sich die Qualität der Veclib: Man erzielt immerhin eine Leistung von 690 MFlops oder 72 % der Peakleistung - für eine komplexe superskalare Architektur ein ausgezeichneter Wert!

Noch einige Bemerkungen zu den Linux-Compilern: Für die Tests kam der egcs-1.1.2 zum Einsatz, der in der Suse-6.2-Distribution enthalten ist. Er gilt nicht zu Unrecht als noch einigermaßen fehlerhaft: Nicht nur lässt sich damit der aktuelle Linux-Kernel nicht kompilieren, sondern auch in meinem einfachen Testprogramm lief ich immer wieder in die seltsamsten Bugs. Deutlich besser wurde es erst, als ich alle Sourcen auf einer lokalen Platte statt auf NFS-gemounteten Partitionen hielt - warum auch immer.

Leider war die Verwendung des älteren und stabileren gcc nicht möglich, da der Fortran-Compiler inzwischen nur mit dem egcs zusammen läuft. Und selbst mit dem obigen C-Testprogramm benötigte ich eine Fortran-Hilfsbibliothek aus dem g77-Paket. Daher wäre eine wilde Mischung der beiden Compiler nötig geworden - ein Verfahren, von dem ich nur abraten kann!

1 oder besser: in die RZ-Beratung!

Peter Junglas, Tel.: 3193


next up previous
Next: Maple für StudentINNen Up: Software Previous: Anzeige verfügbarer Ressourcen
cb 1999-12-02