diff --git a/aufgaben/blatt05/blatt05.md b/aufgaben/blatt05/blatt05.md index a5f76745f73e43f04e0bd69c99f9cc84fa3c1362..a475930f7fa8ce32fddc26ecbcd37c2dfb9599d9 100644 --- a/aufgaben/blatt05/blatt05.md +++ b/aufgaben/blatt05/blatt05.md @@ -1,11 +1,11 @@ Title: Blatt 4 status: hidden -# Parallelrechnerarchitekturen 2 +# Superlinearer Speedup und Vektorbefehle Führen Sie vor dem Bearbeiten des Blattes wieder ein *git pull* durch. -## Aufgabe 2: Superlinearer Speedup (*Abgabe war verschoben von Blatt 04*) +## Aufgabe 1: Superlinearer Speedup (*Abgabe war verschoben von Blatt 04*) Auf der englischen Wikipedia unter wird folgende Aussage zum Thema [superlinearer Speedup](https://en.wikipedia.org/wiki/Speedup#Super-linear_speedup) bei @@ -39,7 +39,7 @@ Problem löst und das bei paralleler Bearbeitung auf einer gem5 Konfiguration m Sie den DDR-RAM in der Beispielkonfiguration durch ein SimpleMemory ersetzen und die Parameter latency und bandwidth setzen. - +- Unter umständen muss das Programm eine Zeit lang laufen um den gewünschten superlinearen Speedup zu zeigen. ### Abgabe @@ -48,6 +48,100 @@ Problem löst und das bei paralleler Bearbeitung auf einer gem5 Konfiguration m +## Aufgabe 2: SIMD Parallelismus ARM-Neon + +Sie haben in der Vorlesung bereits von +SIMD (Single Instruction Multiple Data) oder auch Vektor-Einheiten von +Prozessoren gehört. Dabei handelt es sich um Erweiterungen der eigentlichen +Prozessorarchitektur um eine Komponente, die eine Berechnung gleichzeitig auf +mehr als einem Datum ausführen kann (z.B. Vektoraddition). + +*Neon* ist die SIMD-Erweiterung der ARM-Architektur. Aus +Programmierer-Sicht besteht die Neon-Erweiterung des ARM-Befehlssatzes aus einer +Menge spezieller Assembler-Befehle. Darüber hinaus existiert auch ein +High-Level Interface, welches es dem Programmierer auf +einfache Art und Weise erlaubt, aus Sprachen wie C oder C++ heraus die +Neon-Funktionalität zu benutzen. + +In dem Programm *neon_convert.c* wurde eine Funktion zur Konvertierung +von Farbbildern in Graustufen einmal wie im folgenden in reinem C implementiert + + + void reference_convert (uint8_t * __restrict dest, uint8_t * __restrict src, int n){ + int i; + for (i=0; i>8); + } + } + + +Und einmal mit neon intrinsics implementiert. + + + + + void neon_convert (uint8_t * __restrict dest, uint8_t * __restrict src, int n){ + int i; + uint8x8_t rfac = vdup_n_u8 (77); + uint8x8_t gfac = vdup_n_u8 (151); + uint8x8_t bfac = vdup_n_u8 (28); + n/= 8; + + for (i=0; i