Prüfung Rechnerarchitektur WS 2020/21

Die Seite wird erstellt Gunnar Lauer
 
WEITER LESEN
Prüfung Rechnerarchitektur WS 2020/21
Im Wintersemester 2020/2021 wird die Prüfungsleistung für das Modul Rechnerarchitektur nicht
durch eine Klausur erbracht, sondern in Form einer Programmieraufgabe mit schriftlicher
Ausarbeitung (Ausarbeitung im Umfang von bis zu 4 A4-Seiten).

Bitte lesen Sie sich diese Anleitung zur Prüfungsleistung gründlich durch.

Bei Fragen schreiben Sie bitte eine Email an: moeller@techfak.uni-...

Aufgabenstellung
Realisieren Sie ein Programm zur Sortierung eines Datensatzes mithilfe des bitweisen MSB-
Radix-Sortierverfahrens in Assembler für Intel 64-Bit-Prozessoren (x86-64).

Es liegt ein Datensatz vor, dessen Elemente jeweils aus einer Gleitkommazahl im IEEE-754-
Format "single precision" (4 Byte) und einer vorzeichenlosen ganzen Zahl (4 Byte) bestehen (in
dieser Reihenfolge). Dabei stellt die Gleitkommazahl den "Key" (Schlüssel) dar, nach dem sortiert
wird, und die vorzeichenlose ganze Zahl den "Payload" (Ladung), der bspw. den Index eines
Datenbankeintrags mit umfangreicheren Informationen enthalten kann. Sortiert wird nach dem
Key, aber Key und Payload eines Elements müssen im Sortierverfahren jeweils gemeinsam
transportiert werden. Key und Payload schließen in einem Element unmittelbar aneinander an;
die Elemente schließen im Datensatz unmittelbar aneinander an.

Beim bitweisen MSB-Radix-Sort (auch "binäres MSD-Radix-Sort", MSD = "most significant digit")
wird das Bitmuster der Keys durchmustert, beginnend beim höchstwertigen ("most significant")
Bit (MSB). Zunächst werden die Elemente nach dem MSB sortiert. Innerhalb der beiden
entstehenden Gruppen wird jeweils nach dem Bit mit der zweithöchsten Wertigkeit sortiert usw.
Beachten Sie, dass diese Vorgehensweise für vorzeichenlose ganze Zahlen ausgelegt ist. Sie
müssen das Verfahren für Gleitkommazahlen anpassen (s.u.).

Implementieren Sie Ihr Verfahren rekursiv, d.h. das Unterprogramm zur Sortierung eines
Bereichs von Elementen ruft sich direkt oder indirekt selbst auf, um die zwei nach dem aktuell
betrachteten Bit sortierten Teilbereiche nach dem nächsten Bit zu sortieren.

Ihr Programm soll in der Lage sein, den Datensatz sowohl aufwärts als auch abwärts anhand des
Keys zu sortieren. Für die Sortierung ist der Wert der Gleitkommazahl entscheidend, nicht
deren Bitfolge. Es sind also Vorzeichen, Exponent und Mantisse zu berücksichtigen (bitte finden
Sie dafür eine effiziente Lösung). Sie können dabei Spezialfälle (z.B. unendlich, NaN, Null oder
nicht normalisierte Zahlen) ignorieren.

Die Sortierung soll "in-place" erfolgen, d.h. die Ausgabedaten liegen während der Ausführung
bereits im Speicherbereich der Eingabedaten. Es wird also kein zweiter Datenbereich verwendet.
Dies lässt sich für eine Bit-Position folgendermaßen realisieren: Sollen alle Elemente mit Nullbits
zu Beginn des Speicherbereichs ("links") stehen und alle Elemente mit Einsbits am Ende ("rechts"),
dann sucht man von links nach einem Element mit Einsbit und von rechts nach einem Element
mit Nullbit und tauscht diese Elemente. Dies wird wiederholt, bis kein weiterer Tausch mehr
möglich ist.

Der implementierte Sortieralgorithmus muss nicht notwendig "stable" sein. Es ist also erlaubt,
dass Elemente mit gleichen Keys nach dem Sortieren eine andere Reihenfolge haben als zuvor.

Anmeldung und Abgabe
Es ist keine Anmeldung erforderlich.

Die Abgabe muss bis zum Sonntag, 14. März 2021, 23:59 erfolgen. Eine verspätete Abgabe gilt als
Nichtteilnahme. Die Deadline ist strikt. Die Abgabe erfolgt über die "E-Prüfung" im Lernraum der
Rechnerarchitektur-Vorlesung (Zugang via eKVV). Bitte kennzeichnen Sie Programmdatei und
Ausarbeitung mit Ihrem Account-Namen an der Technischen Fakultät. Für Erika Mustermann
wäre dies z.B. emustermann . Die Programmdatei muss in diesem Beispiel den Dateinamen
radix_emustermann.asm , die Ausarbeitung den Dateinamen ausarbeitung_emustermann.pdf
haben. Sie können Ihre Abgabe bis zur Deadline beliebig oft verändern. Bitte beachten Sie die
Hinweise in der bereitgestellten Anleitung Anleitung_E-Pruefung_RA.PDF . Hinweis: Bitte testen Sie
den Abgabevorgang deutlich vor der Deadline.

Wiederholung
Eine einmalige Wiederholung (2. Versuch) im Wintersemester 2020/2021 ist nur bei Teilnahme
am 1. Versuch möglich. Bei Nichtbestehen im 1. Versuch ist eine Wiederholung nur möglich,
wenn ein Programm und eine Ausarbeitung eingereicht wurden und bei beiden ein Bemühen zur
Lösung deutlich erkennbar ist, aber die Leistung als "nicht bestanden" (Note 5,0) bewertet wurde.
Bei Bestehen im 1. Versuch kann der 2. Versuch genutzt werden, um evtl. eine
Notenverbesserung zu erreichen. Bitte beachten Sie, dass in beiden Fällen die Leistung des 1.
Versuchs auch bei einer Wiederholung der Prüfung eingetragen wird.

Die Wiederholung erfolgt durch Überarbeitung von Programm und Ausarbeitung mit
demselben Thema. Für die Überarbeitung wird eine Frist von 2 Wochen nach der Mitteilung der
Note eingeräumt.

In nachfolgenden Semestern gilt die dann festgelegte Prüfungsform (in der Regel eine Klausur).

Programm
Fügen Sie Ihren Programmcode in das vorgegebene Rahmenprogramm ein (s.u.). Dieses liest
die Kommandozeilen-Parameter in Register ein, liest die zu sortierende Datei in einen
Speicherbereich ein (der dafür alloziert wird) und schreibt die Daten desselben Speicherbereichs
in die Ausgabedatei.

Gefordert ist ein Assemblerprogramm für Intel x86-64-Prozessoren im Intel-Syntax (nicht IA-32,
nicht AT&T-Syntax). Ihr Programm muss mit der vorgegebenen Version des Assemblers nasm
assemblierbar sein (s.u.).

Das Programm soll nur auf einer einzigen CPU (bzw. Core) laufen. Vermeiden Sie also eine
Parallelisierung auf mehrere CPUs / Cores.

Kommentieren Sie Ihr Programm ausgiebig in deutscher Sprache (s.u.). Geben Sie auch
Kommentare für jedes Unterprogramm an, die dessen Eingabe- und Ausgabe-Parameter,
genutzte "globale" Parameter und die von der Funktion modifizierten ("zerstörten") Register
angeben. Parameter können dabei Speicherbereiche oder Register sein.

Ausarbeitung
Format
Auf einer vorangestellten Titelseite geben Sie bitte "Ausarbeitung Rechnerarchitektur
Wintersemester 2020/21" mit dem Titel "Implementierung eines rekursiven bitweisen MSB-Radix-
Sort" sowie Ihren Namen, Vornamen, Studiengang und Ihre Matrikelnummer an. Fügen Sie
darunter bitte folgenden Text ein:
"Hiermit erkläre ich, dass ich das Programm und die vorliegende Ausarbeitung selbstständig
   verfasst habe. Ich habe keine anderen Quellen als die angegebenen benutzt und habe die
   Stellen in Programm und in der Ausarbeitung, die anderen Quellen entnommen wurden, in
   jedem Fall unter Angabe der Quelle als Entlehnung kenntlich gemacht. Diese Erklärung gilt
   auch ohne meine Unterschrift, sobald ich das Programm und die Ausarbeitung über die E-
   Prüfung der Vorlesung Rechnerarchitektur im Lernraum des eKVV an der Universität
   Bielefeld und unter Angabe meiner Matrikelnummer in der Ausarbeitung eingereicht habe."

Die eigentliche Ausarbeitung umfasst bis zu 4 A4-Seiten mit einer Textbreite von 16 cm und einer
Texthöhe von 23 cm. Der Text ist im Zeilenabstand "ein-einhalb-zeilig" zu formatieren. Als
Schriftart wählen Sie dabei bitte Times-Roman in der Größe 12 pt.

Die Liste Ihrer Quellen (Literatur, Webseiten etc.) geben Sie bitte nachfolgend zum eigentlichen
Text an, beginnend auf einer neuen Seite. Hinweise zum Zitieren finden Sie bspw. auf dieser
Webseite: https://www.uni-
bielefeld.de/erziehungswissenschaft/richtigeinsteigen/files/pdf/Zitierhinweise_Stand-Dez-
2017.pdf.

Die Titelseite und die Seite(n) mit der Liste der Quellen werden nicht bei der Seitenzählung
berücksichtigt.

Das eingereichte PDF-Dokument muss ein Format aufweisen, aus dem der Text extrahiert
werden kann (für den Plagiatstest). Vermeiden Sie deshalb bitte Rastergrafiken für Text und
verschlüsselte Formate. Die Abgabe wird nicht bewertet, bis eine für die Plagiatsprüfung
geeignete Fassung zur Verfügung gestellt wird. Hinweis: Sie können die Extrahierbarkeit von Text z.B.
mit dem Linux-Tool pdftotext testen.

Sie können das bereitgestellte LaTeX-Vorlage ausarbeitung_emustermann.tex verwenden.

Inhalt
Erklären Sie Ihre Implementation des rekursiven, bitweisen MSB-Radix-Sort. Gehen Sie dabei auch
auf folgende Aspekte Ihrer Implementation ein:

     Lösung für den Schutz von lokalen Variablen in der Rekursion
     Lösung für das Sortieren in beide Richtungen
     Lösung für die in-place Sortierung
     Lösung für die Behandlung von Vorzeichen, Exponent und Mantisse (effiziente Lösung
     gesucht!)
     Lösung für die Prüfung einzelner Bits im Datenwort
     Implementation des eigentlichen Sortiervorgangs für ein Bit (ggf. auch Behandlung von
     Spezialfällen, z.B. alle Bits gleich)
     vermutete Schwachstellen und Verbesserungsmöglichkeiten.

Vergleichen Sie die Laufzeit Ihres Verfahrens mit dem Vergleichsprogramm stlsort (s.u.). Geben
Sie dabei die Laufzeiten ("user") für verschiedene Größen des Datensatzes an. Wählen Sie
Datensatzgrößen so, dass die Laufzeit jeweils im Bereich einiger Sekunden liegt. Stellen Sie die
Ergebnisse in einer Tabelle oder Grafik dar und diskutieren Sie sowohl die Abhängigkeit der
Laufzeiten von der Anzahl der Elemente im Datensatz als auch die Relation der Laufzeiten
zwischen beiden Programmen.

Hinweise zur Einzelleistung und Betrugsversuchen
Die Programmieraufgabe mit Ausarbeitung ist ein Ersatz für eine Klausur. In einer Klausur ist
sichergestellt, dass die Leistung als Einzelleistung erbracht wird. Derselbe Maßstab gilt auch für
die Programmieraufgabe mit Ausarbeitung. Eine Zusammenarbeit mit anderen Personen in
jeglicher Form gilt deshalb als Betrugsversuch. Für Programmdatei und Ausarbeitung wird ein
elektronischer Plagiatstest durchgeführt. Dadurch aufgedeckte Betrugsversuche werden
geahndet. Bitte denken Sie daran, dass eventuell auch andere TeilnehmerInnen dieselben
Quellen verwenden. Auch wenn wir diese Quellen nicht kennen sollten, würde dadurch ein
Betrugsversuch aufgedeckt.

Sowohl im Quellcode Ihres Programms als auch in Ihrer Ausarbeitung müssen alle verwendeten
Quellen gekennzeichnet sein. Im Quellcode sind alle Programmteile, die aus anderen Quellen
(bspw. Hilfeseiten im Internet) stammen, zu kennzeichnen. Bei zu großem Anteil an Code aus
anderen Quellen gilt das Programm nicht mehr als selbst erbrachte Leistung. In der Ausarbeitung
müssen wörtliche Zitate (auch
Übersetzungen) gekennzeichnet sein. Bei zu großem Anteil (gekennzeichneter) wörtlicher
Übernahmen gilt die Ausarbeitung nicht mehr als selbst erbrachte Leistung.

Es gilt als Betrugsversuch, wenn das Assemblerprogramm durch Compilieren aus einer
Hochsprache erzeugt wurde.

Bewertungskriterien
Die Leistung ist benotet. Abweichungen von dieser Vorgabe sind mit dem Prüfungsamt zu klären.

Die maximale erreichbare Punktzahl ist 100. Die Bestehensgrenze ist 50% (50 Punkte). Es wird
zunächst geprüft, ob Ihr Programm die Aufgabenstellung erfüllt, d.h. tatsächlich bitweises MSB-
Radix-Sort mit rekursiver Bearbeitung und Sortierung "in-place" in Assembler für Intel-x86-64-
Prozessoren implementiert wurde. Ist dies nicht der Fall, gilt die Aufgabe als nicht erfüllt und die
Prüfung damit als nicht bestanden. Ansonsten erfolgt die Bewertung wie folgt:

Funktionstüchtigkeit des Programms (30 Punkte): Ihre Abgabe wird von uns mit dem "Netwide
Assembler" nasm in der Version auf den GZI-Maschinen (2.13.02) zu einer ausführbaren Datei
assembliert. Ein nicht assemblierbares Programm wird nicht weiter untersucht und gilt als "nicht
funktionstüchtig" (0 Punkte). Hinweis: Bitte testen Sie deshalb vor Abgabe auf einer GZI-Maschine, ob
Ihr Programm mit diesem Assembler assemblierbar ist! Ein assemblierbares Programm wird von uns
mehreren Tests mit zufällig erzeugten Eingabedateien unterzogen, jeweils ohne mehrfach
auftretende Keys, mit unterschiedlicher Zahl von Elementen und mit Sortierung in Aufwärts- und
Abwärtsreihenfolge. Der Anteil der Testläufe, bei denen Ihr Programm eine korrekte Sortierung
erzeugt, bestimmt den Grad der Funktionstüchtigkeit und damit die zugewiesene Punktzahl
(bspw. funktionstüchtig in der Hälfte der Fälle: 15 Punkte). Hinweis: Testen Sie deshalb Ihr
Programm ausführlich mit beiden Sortierreihenfolgen und mit unterschiedlichen Testdaten (erzeugt mit
dem Programm gendata , s.u.) und vergleichen Sie die Ausgabedateien mit dem Ergebnis des
Vergleichsprogramms stlsort (für Eingabedateien ohne mehrfach auftretende Keys). Für den
Vergleich von Dateien können Sie das Unix-Kommando cmp verwenden. Zusätzlich steht Ihnen das
Programm chksort zur Verfügung (s.u.), mit dem die Sortierung überprüft werden kann.

Effizienz der gefundenen Lösung (15 Punkte): Bewertet wird die Effizienz der gefundenen
Lösung hinsichtlich folgender Aspekte: Sortierung in beiden Richtungen; Behandlung von
Vorzeichen, Exponent und Mantisse bei den Gleitkommazahlen; Sortiervorgang für ein
ausgewähltes Bit.

Laufzeit Ihres Programms (15 Punkte): Die von uns erarbeitete Musterlösung hat für 100 Mio.
Elemente eine ähnliche Laufzeit wie das Vergleichsprogramm stlsort (siehe unten). Die Laufzeit
Ihres Programms im Vergleich zu stlsort fließt in die Bewertung ein. Sie können die Laufzeit
Ihres Programms ermitteln, indem Sie beim Start time auf der Kommandozeile voranstellen.
Relevant ist dabei die ausgegebene "User"-Zeit. Bewertungsskala: bis zur doppelten Laufzeit im
Vergleich zu stlsort 15 Punkte, bis fünffache Laufzeit 10 Punkte, bis zehnfache Laufzeit 5
Punkte, sonst 0 Punkte. Die relativen Laufzeiten (Radix-Sort zu stlsort ) werden bei der
Bewertung über mehrere Messungen gemittelt. Ein nicht assemblierbares oder nicht zumindest
bei einem Laufzeittest funktionstüchtiges Programm erhält hierbei 0 Punkte.

Kommentierung des Programms in deutscher Sprache (10 Punkte): Bewertet wird, wie
ausführlich Ihr Programm kommentiert wurde. Dabei muss jede Programmzeile mit einem
verständlichen Kommentar versehen sein (Ausnahmen sind nur offensichtliche Befehlsabfolgen
wie bspw. push -/ pop -Sequenzen am Anfang und Ende von Unterprogrammen). Bitte vermeiden
Sie dabei eine Beschreibung der Assembleranweisung (z.B. inc rdx ; erhöhe Register rdx um
1 ), sondern erläutern Sie mit dem Kommentar Ihren Algorithmus (z.B. inc rdx ; nächstes Byte
im Eingabepuffer ). Hinweis: Die Kommentierung in deutscher Sprache wird vorgeschrieben, um
einfacher Bezüge zwischen den Kommentaren und der Beschreibung Ihres Verfahrens in der
deutschsprachigen Ausarbeitung herstellen zu können. In begründeten Ausnahmefällen kann beides in
Englisch erfolgen; dies ist aber vor Beginn der Bearbeitung mit dem Prüfenden zu klären.

Ausarbeitung in deutscher Sprache (30 Punkte): Die Ausarbeitung ist in deutscher Sprache
vorzulegen (zu Ausnahmen s.o.). Bewertet wird die inhaltliche Korrektheit (u.a. auch
Übereinstimmung mit der Implementation), die Vollständigkeit, die Klarheit der Darstellung und
die Präzision der Formulierungen. Hinweis: Bitte verwenden Sie die Rechtschreibprüfung Ihres Editors
und lesen Sie Ihre Ausarbeitung vor der Abgabe nochmals gründlich durch.

Bereitgestellte Materialien
Es werden folgende Textdokumente, Programme und Skripte (für das Betriebssystem Linux) auf
der Webseite der Veranstaltung https://www.ti.uni-
bielefeld.de/html/teaching/WS2021/techinf1/index.html bereitgestellt:

     Anleitung_E-Pruefung_RA.PDF : Anleitung für die E-Prüfung.

     ausarbeitung_emustermann.tex (bitte Account-Namen im Dateinamen sowie Angaben
     zu Ihrer Person in der Datei vor der Abgabe anpassen): Latex-Vorlage für die
     Ausarbeitung. Die daraus erzeugte PDF-Datei liegt ebenfalls bei.
     radix_emustermann.asm (bitte Account-Namen im Dateinamen sowie Angaben zu Ihrer
     Person in der Datei vor der Abgabe anpassen): Rahmen für Ihr Assembler-Programm.
     Bitte fügen Sie Ihre Unterprogramme und deren Aufruf in den beiden gekennzeichneten
     Bereichen ein und lassen Sie das Programm ansonsten unverändert. In der bereitgestellten
     Form liest das Programm eine Eingabedatei ein (inklusive Allozierung von Speicher) und
     schreibt dieselben Daten in die Ausgabedatei zurück. Das ausführbare Programm liest
     folgende Kommandozeilen-Parameter ein:

           : Sortierung in aufsteigender Reihenfolge ( 1 ) oder absteigender Reihenfolge ( 0 )
           : Name der Eingabedatei
           : Name der Ausgabedatei
     mkasm64 : Skript zum Assemblieren. Erzeugt eine ausführbare Datei mit demselben
     Rumpfnamen wie die Quelldatei. Aufruf: mkasm64 radix_emustermann . Benötigt den
     Assembler nasm .

     gendata.c : C-Programm zum Erzeugen zufälliger Testdateien. Das Programm erwartet
     folgende Kommandozeilen-Parameter:

           : Die Anzahl von Elementen im Datensatz. Erzeugen Sie kleine Dateien (z.B. 10
          Elemente) für Debug-Zwecke und große Dateien (z.B. 100000000 ), um lange Laufzeiten
          für Zeitmessungen zu gewährleisten.
: Die Datei darf denselben Key mehrfach enthalten (Angabe 0 ) oder
         nicht (Angabe 1 ). Die Erzeugung von Dateien ohne mehrfache Keys dauert lang und ist
         nur für kleinere Größen sinnvoll. Dateien ohne mehrfache Keys werden benötigt, wenn
         Sie die Ergebnisdateien Ihres Programms mit denen von stlsort (siehe unten)
         vergleichen (z.B. mit dem Programm cmp ), da die dort verwendete Funktion
          std::sort() mehrfach auftretende Keys ggf. anders sortiert.
           : ein Identifikator (Zeichenkette) zur Unterscheidung mehrerer Dateien.
           : Pfadname eines Verzeichnisses, in dem die erzeugte Datei abgelegt werden soll.
         Der Dateiname wird automatisch festgelegt (z.B. num10_nodup1_id1.rnd ) und
         kennzeichnet alle Kommandozeilen-Parameter.
     mk_gendata : Shell-Skript ( tcsh ) zum Compilieren von gendata.c zur ausführbaren Datei
     gendata . Aufruf ohne Kommandozeilen-Parameter. Benötigt den C-Compiler gcc .

     prtdata.c : C-Programm zum Anzeigen von Ein- oder Ausgabedateien. Das Programm zeigt
    jeweils den Key als Gleitkommazahl, als Bitmuster (hexadezimal) sowie als Vorzeichen,
    Charakteristik (hexadezimal) und normalisierte Mantisse (hexadezimal) sowie den Payload
    (dezimal). Aufruf mit Angabe des Dateinamens, z.B.: prtdata num10_nodup_id1.rnd .

     mk_prtdata : Shell-Skript ( tcsh ) zum Compilieren von prtdata.c zur ausführbaren Datei
     prtdata . Aufruf ohne Kommandozeilen-Parameter. Benötigt den C-Compiler gcc .

     chksort.C : C++-Programm zum Überprüfen, ob eine Datei ausschließlich sortierte Keys
    enthält (identische aufeinanderfolgende Keys sind zulässig) und ob alle Test-Payloads
    vorhanden sind. Aufruf mit Angabe der Sortierrichtung ("up" = 1, "down" = 0) und des
    Dateinamens, z.B. chksort 1 mydata.srt .

     mk_chksort : Shell-Skript ( tcsh ) zum Compileren von chksort.C zur ausführbaren Datei
     chksort . Aufruf ohne Kommandozeilen-Parameter. Benötigt den C++-Compiler g++ .

     stlsort.C : C++-Programm zum Sortieren einer Datei mithilfe der Funktion std::sort()
    aus der C++ Standard Template Library (STL). Die Kommandozeilen-Parameter sind
    dieselben wie beim Programm radix_emustermann .

     mk_stlsort : Shell-Skript ( tcsh ) zum Compilieren von stlsort.C zur ausführbaren Datei
     stlsort . Aufruf ohne Kommandozeilen-Parameter. Benötigt den C++-Compiler g++ .

Wichtiger Hinweis zur Arbeit im GZI
Die benutzten Dateien mit den unsortierten oder sortierten Daten können sehr groß sein (z.B.
100 Mio. Elemente mit je 8 Bytes: fast 1 GByte), um Laufzeiten im Sekundenbereich zu realisieren.
Bitte erzeugen Sie diese Dateien nur temporär und löschen Sie diese nach Benutzung wieder aus
dem Dateisystem. Alternativ können Sie die Dateien auch im Verzeichnis /tmp ablegen. Dort
werden sie beim täglichen Neustart der GZI-Maschinen gelöscht.
Sie können auch lesen