Cffada
Eine Beschreibung des Cffada-Algorithmus und der verwendeten (Sub-)Algorithmen können der Arbeit von Babette Eckart entnommen werden.
Die Umwandlung der generierten Abhängigkeitsrelationen in das LooPo-Format findet sich am Ende dieser Seite.
Benutzung (direkt):
cffada <tempdir> <project>
[<cffada_options>]* [>debug_options>]*
<cffada_options>=
<debug_options> = <debug_name> <debug_value>
<debug_name> (DEFAULT) =
- loopo_cffada_debug (1)
- belongsto_debug (0)
- decorate_debug (0)
- cffada2_debug (2)
- cffada_start_debug (0)
- cffada_traverse_debug (2)
- simplify_debug(0)
- optimization_debug(0)
und <debug_value> ein Integer.
Benutzung (über das LooPo Frontend):
- Intra-statement dependences
: Entspricht same_op_possible im cffada-Aufruf.
- Generate IF preds
: Entspricht usePred im cffada-Aufruf.
- Use exists preds
: Entspricht useExists im cffada-Aufruf.
- Pred without params
: Entspricht pred_without_params im cffada-Aufruf.
- Optimize anti dependence
: Entspricht optimize_anti_dependence im cffada-Aufruf.
- Types : Die Abhängigkeitstypen die berechnet werden sollen. Wird keine explizit angefordert, so werden alle 'true'-Abhängigkeiten berechnet.
- Simplification method : Entspricht simplification im cffada-Aufruf.
FUNCOUT : Aktiviert die Ausgabe des Zustand bei Ein- und Austritt aus Methoden des Cffada-Algorithmus.
optimize_anti_dependency : Erzwingt die Optimierung bei der Berechnung von Antianhängigkeiten.
pred_without_params : Prädikate werden ohne Parameter erzeugt.
true : Berechne zusätzlich zu den anderen Abhängigkeiten auch die true Abhängigkeiten
anti : Berechne zusätzlich zu den anderen Abhängigkeiten auch die anti Abhängigkeiten
output : Berechne zusätzlich zu den anderen Abhängigkeiten auch die output Abhängigkeiten
all : Berechne true,anti und output Abhängigkeiten
useExists : Falls Existenzquantoren auftreten berücksichtige diese.
usePred : Benutze die Informationen die durch die 'if'-Statements generiert werden.
same_op_possible : Hiermit werden auch Anti-Abhängigkeiten innerhalb einer Instanz eines Statements zugelassen.
D.h. bei dem Program
| DO i=1,10 |
|
A[i]=A[i]+1 |
| END DO |
wird ohne die Option keine Abhängigkeit festgestellt. Mit eingeschalteter Option ergibt sich eine Anti-Abhängigkeit.
simplification : Erzwingt welcher Vereinfachungsalgorithmus benutzt wird. Mögliche Werte : 0 - 2 .
simplify_debug : Dient zur Steuerung der Debugausgabe des Vereinfachungsalgorithmus. Mögliche Werte : 1 - 9
optimization_debug : Dient zur Steuerung der Debugausgabe des Optimierungsalgorithmus. Mögliche Werte : 1 - 9
- Wir bekommen die Relationen vom Frontend
- Falls die Option "useExists" nicht angegeben wurde, so werden aus allen Abhängigkeiten die Existenzquantoren rausgeschmissen. Diese werden im Moment vom Frontend nicht generiert. Bei Aufruf der Funktion 'simplify' von Omega kann das aber passieren (steht z.B. in einer Relation a*2 = b && a*3=c , also a ganzzahlig durch 2 und 3 teilbar, so fügt Omega 'exists alpha s.t. : a*6=alpha' ein)
- wir iterieren über jede Relation und fügen Identitäten (z.B. Out_1=In_1) für jede nicht-gebende Schleifenvariable ein.
Z.B. :
do i=..
do j=..
something (S1)
end do
do k=..
something (S2)
end do
end do
und eine Abhängigkeit S1->S1 so fügen wir in die Relation Out_3 = In_3 (In_3 ist die dritte Schleifenvariable, in unserem Fall 'k')
- Wir durchsuchen alle Relationen nach Paramatern. Dadurch kann man später zugesichert werden, das in zwei Matrizen diesselbe Spaltennummer sich auf den gleichen Parameter bezieht. Die entsprechende Funktion von Omega (get_global_decls) gibt nur die in der Relation vorkommenden Paramater und diese in beliebiger Permutation zurück.
- Wir durchsuchen alle Relationen auf "zu wenig" definierte Variablen. D.h. Variablen für die wir in der h-Transformationsmatrix keinen Eintrag hätten. Für jede gefundene Variable erzeugen wir einen Pseudoparameter (Präfix = STRING_CFFADA_UNDEF (loopo_cffada.cc))
In jeder Relation die "zu wenig" definierte Variable hat fügen wir nun eine Gleichung der Form 'zu_wenig_definierte_Variable = pseudo_parameter' ein. Ein Überspringen dieses Schrittes kann zu 'Assertion failed' in den Konstruktoren 'Omega2Eq' führen.
- Alle im letzten Schritt erzeugten Pseudoparameter werden in die Symboltabelle eingetragen.
- Falls die Option 'useExists' angegeben wurde durchsuchen wir die Relationen nach vorhandenen Existenzquantoren und ersetzen diese durch Pseudoparameter mit LooPo-konformen Namen (STRING_CFFADA_EXISTS in loopo_cffada.cc).
- Die Symboltabelle wird in einen konsistenten Zustand gebracht : Falls Existenzquantoren bzw. Prädikate erwünscht ('useExists' bzw. 'usePred') werden diese eingefügt.
- Wir übergeben jede einzelne Relation der Konvertierungsfunktion
- Wir korrigieren die Nummern der Abhängigkeiten. Dies ist nötig, da zuvor jede Abhängigkeitsart (true,anti,output) einzeln für sich konvertiert wurde, also die jeweilige Nummerierung mit 1 beginnt.
Axel Krauth zuletzt geändert am 29.01.2001