• Keine Ergebnisse gefunden

¨Ubungen zur Vorlesung “Architektur und Programmierung von Grafik- und Koprozessoren” ¨Ubungsblatt 3

N/A
N/A
Protected

Academic year: 2022

Aktie "¨Ubungen zur Vorlesung “Architektur und Programmierung von Grafik- und Koprozessoren” ¨Ubungsblatt 3"

Copied!
2
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Ubungen zur Vorlesung “Architektur und Programmierung ¨ von Grafik- und Koprozessoren”

Ubungsblatt 3 ¨

Sommersemester 2019

3 Programmieren f¨ ur Cache Architekturen Aufgabe 3.1

Gegeben sei die MatrixA, f¨ur die gilt:

Ai,j= (i, j), i, j= 0,1, .., N−1. (1) Visualisieren SieA f¨ur N = 8 mit Hilfe einer Tabelle. Gehen Sie dabei wie folgt vor. W¨ahlen Sie f¨ur die Matrixelemente deren Bin¨arrepr¨asentation. F¨uhren Sie f¨ur die Paare von Bin¨arzahlen (i, j) diein shuffle Operation durch:

k(i, j) = (k5, .., k2, k1, k0) := (i2, j2, .., i0, j0). (2) Die Bin¨arrepr¨asentation der sich ergebenden nat¨urlichen Zahlksetzt sich immer abwechselnd aus den Bin¨arziffern der Zahlpaare (i, j) zusammen. Tragen Sie das Ergebnis in die Tabelle der Gr¨oße 8×8 als bin¨are Festkommazahl, sowie als Dezimalzahl, ein. Verbinden Sie die Elemente gem¨aß ihres Betrags aufsteigend sortiert mit einem Linienzug.

Aufgabe 3.2

a.)

Ubersetzen Sie die den ¨¨ Ubungsunterlagen beigef¨ugte Dateimorton.cppmit einem C++11 kom- patiblen Compiler. Aktivieren Sie dabei die h¨ochstm¨ogliche Optimierungsstufe mit Bezug auf die zu erwartende Programmausf¨uhrungsgeschwindigkeit. Eine entsprechende Kommandozeile f¨urgcc kann beispielsweise wie folgt aussehen.

g++ morton.cpp -std=c++11 -O3 -o morton

Die Template Klasse Grid implementiert ein zweidimensionales Array dynamischer Gr¨oße, auf dessen Elemente Sie lesend und schreibend mitoperator()zugreifen k¨onnen:

Grid<float> grid(W, H); // 2-D Array der Gr¨oße W x H

grid(1, 2) = 3.14f; // Schreiboperation an Speicherstelle [1,2]

In der Funktion main() wird zun¨achst ein 2-D floating point Array erzeugt und dann mit Zu- fallszahlen gef¨ullt. Im Anschluss wird ein Bildverarbeitungsfilter auf das Array angewendet, der zun¨achst zeilenweise, und danach spaltenweise ¨uber das Array iteriert.

1

(2)

F¨uhren Sie das vorhin kompilierte Programm aus. Was f¨allt Ihnen bzgl. der Ausf¨uhrungszeiten f¨ur das Anwenden des Bildverarbeitungsfilters auf? Wie erkl¨aren Sie sich das Verhalten?

b.)

F¨ugen Sie zur KlasseGridnun eine Alternativimplementierung f¨ur operator()hinzu, die Sie mittels des bereits definierten FlagsMORTONzur Kompilierzeit aktivieren und deaktivieren k¨onnen.

Dazu implementieren Sie dieraumf¨ullenden Kurven(engl.: space-filling curves), die Sie sich in Auf- gabe 3.1 hergeleitet haben. Implementieren Sie eine Hilfsroutineexpand bits(). Mit Hilfe dieser l¨asst sich diein shuffle Operation ausf¨uhren:

int z = expand bits(x) | (expand bits(y) << 1)

Mit dem so erzeugten “Morton Code” k¨onnen Sie in das Daten-Array der Grid Klasse hinein indexieren.expand bits()zieht die x/y Koordinaten mit Hilfe von Bit-Operationen und Mas- kenkonstanten sukzessive auseinander:

1.x = ---.---.FEDCBA98.76543210 2.x = ---.FEDCBA98.---.76543210 3.x = ----FEDC.----BA98.----7654.----3210 4.x = --FE--DC.--BA--98.--76--54.--32--10 5.x = -F-E-D-C.-B-A-9-8.-7-6-5-4.-3-2-1-0

(Die mit “−” annotierten Bits ersetzen Sie durch 0-bits, damit diein shuffle Operation mit Hilfe des bitweisen Oders durchgef¨uhrt werden kann.)

F¨uhren Sie das so modifizierte Programm aus. Vergleichen Sie die Ausf¨uhrungszeiten der neuen Implementierung mit denen f¨ur die alte Implementierung. Was f¨allt Ihnen auf und welche Er- kl¨arung haben Sie?

c.)

Im vorangegangenen Aufgabenteil haben Sie eine Cache Optimierung f¨ur 2-D Datenstrukturen implementiert. F¨allt Ihnen im konkreten Fall eine pragmatischere L¨osung ein, um die Programm- ausf¨uhrungszeit zu beschleunigen? (Hinweis: Bei der L¨osung sei es erlaubt, die Anordnung aller Daten im Speicher zu ver¨andern.) K¨onnen Sie sich trotzdem Umst¨ande vorstellen, unter denen die Cache Optimierung aus dem vorangegangenen Aufgabenteil vorteilhaft ist? (Hinweis: ¨Uberlegen Sie sich, ob es Speicherzugriffsmuster mit bestimmten Charakteristika gibt, f¨ur die eine Cache Optimierung mit Morton Codes sinnvoll ist.)

Das ¨Ubungsblatt wird am 02.05.2019 besprochen.

2

Referenzen

ÄHNLICHE DOKUMENTE

“Sampling” bestimmt. Dies ist eine in den Prozessor eingebaute Funktionalit¨ at, die, falls aktiviert, die Instruktionspipeline zu definierten Zeitpunkten anh¨ alt und

C++ spezifiziert keine Garbage Collection (der Standard schließt sie nicht explizit aus, aber es gibt keine Implementierungen, die mir bekannt sind). Daher m¨ ussen alle Ressourcen,

I Vulkan / Modernes OpenGL: minimaler Vertex Shader verpflichtend (außer Compute). Ohne minimalen Fragment Shader kein Bild (manchmal Ergebnis

GPU Readback (d. Rendering in einen Offscreen Buffer und dann Transfer der Farb- und/oder Tiefeninformation in Host Speicher der Applikation) ist mit diesem asynchronen Modell

ADD $R1 C Addiere den konstanten Wert C auf den Inhalt von Register $R1 4 TZ LD $R1 [S] Lade den Inhalt an Speicherstelle [S] in Register $R1 10 TZ ST [S] $R1 Speichere den Inhalt

Trifft man die vereinfachende Annahme, dass geometrische, aus Dreiecken zusammengesetzte Objekte geschlossen sind und immer nur von außen betrachtet werden, kann man vor dem

Der Ray Tracer geht im Weiteren davon aus, dass totale interne Reflektion aufgetreten ist, wenn refract() einen 0-Vektor zurückgegeben hat und ruft in dem Fall die Funktion

Ihr paralleles GPU Programm verwendet zur Berechnung ein zweidimensionales Gitter der Größe N × N , sodass jedem Matrixelement aus der Ergebnismatrix C ein einzelner Thread