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>]*

Optionen

<cffada_options>=

Debugoptionen

<debug_options> = <debug_name> <debug_value>
<debug_name> (DEFAULT) = und <debug_value> ein Integer.

Benutzung (über das LooPo Frontend):

Beschreibung der Optionen

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 .

Beschreibung der Debug-Optionen

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

Beschreibung des Backends

  1. Wir bekommen die Relationen vom Frontend
  2. 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)
  3. 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')
  4. 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.
  5. 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.
  6. Alle im letzten Schritt erzeugten Pseudoparameter werden in die Symboltabelle eingetragen.
  7. 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).
  8. Die Symboltabelle wird in einen konsistenten Zustand gebracht : Falls Existenzquantoren bzw. Prädikate erwünscht ('useExists' bzw. 'usePred') werden diese eingefügt.
  9. Wir übergeben jede einzelne Relation der Konvertierungsfunktion
  10. 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