Ein weiteres Optimierungs-Problem sind scheinbare Rückgriffe, die vor
allem dann auftreten, wenn Array-Offsets oder Schrittweiten in Schleifen
als Funktions-Parameter übergeben werden. Da das Vorzeichen beim
Compilieren nicht bekannt ist, können manchmal Rückgriffe nicht
ausgeschloßen werden, obwohl sie im Programm nicht wirklich vorkommen.
Ähnliche, wenn auch nicht so drastische Effekte gibt es, wenn die Länge
einer Schleife ein Parameter ist: Mangels besseren Wissens wird vom
Compiler immer vektorisiert und auch immer eine äußere Schleife für das
Strip Mining angelegt. Wäre die Zahl der Iterationen bekannt, könnte man
das Strip Mining u.U. unterlassen, andere Schleifen gar nicht
vektorisieren, weil sie zu kurz sind und ggf. die Reihenfolge
geschachtelter Schleifen ändern. Für alle diese Fälle gibt es die
Möglichkeit, mit Hilfe von Compiler-Direktiven zusätzliche Informationen
in den Code einzubauen. Da sich das Problem bei Verwendung des Application
Compilers durch das Weiterreichen von Konstanten aber nicht mehr so sehr
stellt, sollen hier nur kurz die wichtigsten Direktiven kurz erwähnt
werden. Eine Direktive BLA_DIREKTIVE erscheint im Source-Code als
C$DIR BLA_DIREKTIVE (in Fortran)
bzw.
#pragma _CNX bla_direktive (in C).
FORCE_VEKTOR, PREFER_VECTOR, NO_VECTOR, SCALAR
vor einer Schleife gibt an, ob sie immer, nur wenn es sicher ist oder nie
vektorisiert werden soll. Bei SCALAR wird sie auch nicht parallelisiert.
Ähnliche Anweisungen gibt es für die Parallelisierung.
NO_RECURRENCE
Die folgende Schleife enthält keinen Rückgriff, auch wenn es so aussieht.
MAX_TRIPS(Anzahl)
In der folgenden Schleife wird höchstens ''Anzahl'' mal iteriert.
UNROLL
Die nächste Schleife ist sie kurz, daß sie in Einzelanweisungen
aufgelöst (''unrolled'') werden soll.
PEEL_ALL, PEEL, NO_PEEL
Aus der nächsten Schleife sollen immer bzw. nur, wenn es nicht zu aufwendig
wird bzw. nie spezielle Anfangs- und Endwert-Behandlungen herausgezogen
werden.
Peter Junglas 18.10.1993