Vermeiden von Aliassen

Das größte Problem (jedenfalls in C) sind die (potentiellen) Aliasse, die der Compiler an vielen Stellen annehmen muß und daher nicht vektorisieren kann. Am einfachsten ist es natürlich, den Application Compiler zu benutzen, denn dieser verfolgt durch das ganze Programm hindurch, wohin welche Pointer zeigen, und löst somit viele scheinbare Aliasse auf. Gelingt dies in einigen Fällen nicht, so kann man durch das Einhalten einiger einfacher Regeln oft weiterkommen: Zunächst sollte man versuchen, das interne Alias-Array so klein wie möglich zu halten, indem man wenig mit Adress-Operatoren arbeitet und auf Werte von globalen Variablen in Schleifen zugreift, indem man sie vorher lokalen Variablen zuweist und diese benutzt. Folgendes Beispiel, das zunächst aus zwei Gründen nicht vektorisiert, wird dadurch problemlos optimiert:

vorher:

     int offset = 2;

     void bla(int a[], int *n)
     {
        int i;

        for (i = 0; i < *n; i += offset)
        {
           a[i] = 3030;
        }
     }
nachher:
     int offset = 2;

     void fein(int a[], int n)
     {
        int i;
        int lok_off = offset;

        for (i = 0; i < n; i += lok_off)
        {
           a[i] = 3030;
        }
     }
Für viele Fälle hilft noch folgende Möglichkeit über eine Convex-Erweiterung: In ANSI-C besteht kein großer Unterschied zwischen einer Deklaration der Form
     void foo1(float *a, float *b);
und
      void foo1(float a[], float b[]);
solange man die Pointer a und b nicht ändern will. Dem Convex-Compiler kann man nun aber durch die Option ''-alias array_args'' mitteilen, daß keine Überlappungen zwischen Array-Argumenten bestehen, die in der zweiten Form deklariert sind, sowie zwischen diesen und globalen Variablen. Mit anderen Worten: Solche Arrays werden nicht als Pointer betrachtet, die irgendwohin zeigen können, sondern als ordentliche Arrays, die ihren eigenen Speicherbereich haben. Auf diese einfache Weise lassen sich ein Großteil hartnäckiger Alias-Probleme lösen. Allerdings ist man dann selbst dafür verantwortlich, daß auch wirklich keine Aliasse zwischen den Arrays auftreten. Solange man den entsprechenden Routinen auch nur ''echte'' Arrays übergibt und keine Pointer, sollte das aber keine Probleme machen.

previous    contents     next

Peter Junglas 18.10.1993