Commit 142d7fe2 authored by Christoph Gerum's avatar Christoph Gerum

Add test files for neon

parent f0123693
Title: Blatt 5
Title: Blatt 4
status: hidden
# Multicore Architekturen / Cache Coherency (**DRAFT**)
# Parallelrechnerarchitekturen 2
Führen Sie vor dem Bearbeiten des Blattes wieder ein *git pull* durch.
## Aufgabe 2: 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
Parallelrechnerarchitekturen gemacht:
> Sometimes a speedup of more than $A$ when using $A$ processors is observed
> in parallel computing, which is called ''super-linear speedup''. Super-linear
> speedup rarely happens and often confuses beginners, who believe the t
> heoretical maximum speedup should be $A$ when $A$ processors are used.
Da Sie ja nicht zu den genannten "`Anfängern"' gehören stiftet bei Ihnen
das Auftreten von superlinearem Speedup keine Verwirrung, so dass
Ihnen die folgenden Aufgaben auch keine Probleme bereiten dürften.
Schreiben Sie ein Benchmark-Programm, das ein von Ihnen definiertes
Problem löst und das bei paralleler Bearbeitung auf einer gem5 Konfiguration mit mehreren Kernen einen superlinearen Speedup zeigt.
### Fragen
- Beschreiben Sie mindestens eine Ursache für das Zustandekommen von
superlinearem Speedup bei der Verwendung eines Parallelrechners zur Lösung
eines Problems.
- Erstellen sie wie in Aufgabe 1 ein Schaubild das den Verlauf des Speedups bei
einer schrittweisen Erhöhung der Anzahl der Rechenkerne zeigt. Wo tritt superlinearer Speedup auf?
### Tips
- Wenn Sie versuchen einen superlinearen Speedup durch Cacheeffekte zu erzielen
kann es hilfreich sein den Speicher sehr langsam zu machen. Dazu können
Sie den DDR-RAM in der Beispielkonfiguration durch ein SimpleMemory ersetzen
und die Parameter latency und bandwidth setzen.
### Abgabe
1. der Quellcode des Programms und die verwendete gem5 konfiguration
2. die Antworten auf die Fragen
#include <arm_neon.h>
#define SIZE 512
void reference_convert (uint8_t * __restrict dest, uint8_t * __restrict src, int n){
int i;
for (i=0; i<n; i++){
int r = *src++; // load red
int g = *src++; // load green
int b = *src++; // load blue
// build weighted average:
int y = (r*77)+(g*151)+(b*28);
// undo the scale by 256 and write to memory:
*dest++ = (y>>8);
}
}
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<n; i++) {
uint16x8_t temp;
uint8x8x3_t rgb = vld3_u8 (src);
uint8x8_t result;
temp = vmull_u8 (rgb.val[0], rfac);
temp = vmlal_u8 (temp,rgb.val[1], gfac);
temp = vmlal_u8 (temp,rgb.val[2], bfac);
result = vshrn_n_u16 (temp, 8);
vst1_u8 (dest, result);
src += 8*3;
dest += 8;
}
}
uint8_t src[SIZE*SIZE*3];
uint8_t dest[SIZE*SIZE];
int main(int argc, char **argv){
if(argc == 1){
neon_convert(dest, src, SIZE*SIZE);
}
else if(argc == 2 && strcmp(argv[1], "-r") == 0){
reference_convert(dest, src, SIZE*SIZE);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment