Du befindest dich hier: FSI Informatik » Prüfungsfragen und Altklausuren » Hauptstudiumsprüfungen » Lehrstuhl 2 » Prüfung vom 23.07.2026
Prüfung vom 23.07.2026
- Prüfer: Prof. Philippsen
- Beisitzer: Tobias Heineken
(F)rage, (A)ntwort
Einstieg: KFG
F: Was macht ein Compiler denn als erstes mit Programm-Code, wenn er optimieren will und warum?
A: KFG (für Analysen, um Legalität der Optimierungen zu garantieren)
F: Was ist ein KFG und bauen Sie mal einen.
F: Was ist SSA und machen Sie mal Wertnummerierungsverfahren (Da wollten Sie bei mir genau wissen, wann eine vorläufige Phi-Funktion bearbeitet wird).
F: Was ist ein Alias und warum müssen wir das wissen?
A: Alias = selbe Speicherstelle über zwei unterschiedliche Identifier erreichbar. Brauchen das für Legalitäts-Check bei z.B. Konstantenfortschreibung.
F: machen Sie mal Steensgard (Der Code war einfach 35 Zeilen lang ) hier mal eine stark gekürzte und vereinfachte Version:
int r;
void foo(int a) {
int c = 5;
int *ptr = &c;
ptr = &a;
r = a + 13 + c;
}
raus kommt: ptr → {c, a}
F: Was sind denn hier jetzt Aliase?
A: Alias sind {ptr, a}, {prt,c} und {a,c} (v.A. auf letzteres wollten sie als spannendes Resultat hinaus, weil man mit Steensgard alleine hier keine Konstantenfortschreibung machen kann)
F: Hier Blatt mit Code, was kann man hier machen?
int A[10, 20];
void foo(int p) {
for (int i = 0; i < p; i++) {
A[1, i] = A[0,p];
A[1,i] = p + 13;
}
}
A: Schleifeninvarianten Code rausziehen
int A[10, 20];
void foo(int p) {
int t1 = A[0,p];
int t2 = p + 13;
for (int i = 0; i < p; i++) {
A[1, i] = t1;
A[1,2*i] = t2;
}
}
F: und jetzt will ich die Schleife parallelisieren…
A: erst Abhängigkeitsvektoren aufstellen: output-Abhängigkeit einmal d(≤) und d( = ), deswegen kann ich die Schleife nicht direkt parallel ausführen.
ab hier war ich bissi lost und hab Hilfe bekommen
Erst Loop-Peeling, damit die Abhängigkeit in der ersten Iteration weg ist:
int A[10, 20];
void foo(int p) {
int t1 = A[0,p];
int t2 = p + 13;
if (p >= 0) {
A[1, 0] = t1;
A[1, 0] = t2;
}
for (int i = 1; i < p; i++) {
A[1, i] = t1;
A[1, 2*i] = t2;
}
}
Jetzt ist nur noch die eine output-Abhängigkeit vorhanden → jetzt ist Schleifenrumpfteilen möglich
Dann sind beide resultierenden Schleifen parallel ausführbar.
