Parcourir la source

Wydanie R2019.06.2: SSE

Jan Potocki il y a 5 ans
Parent
révision
523a597a4d
4 fichiers modifiés avec 143 ajouts et 0 suppressions
  1. 8
    0
      lab6/Makefile
  2. 23
    0
      lab6/rdtsc.s
  3. 76
    0
      lab6/sse.c
  4. 36
    0
      lab6/suma_sse.s

+ 8
- 0
lab6/Makefile Voir le fichier

@@ -0,0 +1,8 @@
1
+sse: sse.c suma_sse.s rdtsc.s
2
+	gcc -g sse.c suma_sse.s rdtsc.s -o sse -no-pie
3
+
4
+
5
+all: sse
6
+
7
+clean:
8
+	rm -f sse

+ 23
- 0
lab6/rdtsc.s Voir le fichier

@@ -0,0 +1,23 @@
1
+# Jan Potocki 2019
2
+# Funkcja odczytujaca i zwracajaca wartosc TSC (time-stamp counter)
3
+
4
+.globl rdtsc
5
+.type rdtsc, @function
6
+
7
+rdtsc:
8
+pushq %rbp              # Wejscie do funkcji
9
+movq %rsp, %rbp
10
+pushq %rbx              # Zapisanie wartosci rbx na stosie
11
+                        # (zgodnie z konwencja wywolan)
12
+
13
+movl $0, %eax           # Wybor Maximum Return Value dla CPUID
14
+cpuid                   # Rozkaz serializujacy - zapobiega przesunieciu
15
+                        # rdtsc przez optymalizacje na poziomie mikrokodu
16
+rdtsc                   # edx:eax - time-stamp counter
17
+
18
+shlq $32, %rdx          # Przesuniecie bitow z edx do wyzszej polowy rdx
19
+orq %rax, %rdx          # W rax zwracany wynik (zlozony z edx:eax)
20
+
21
+popq %rbx               # Przywrocenie wartosci rbx ze stosu
22
+popq %rbp               # Wyjscie z funkcji
23
+ret

+ 76
- 0
lab6/sse.c Voir le fichier

@@ -0,0 +1,76 @@
1
+#include <stdio.h>
2
+#include <stdlib.h>
3
+#include <time.h>
4
+
5
+// Dlugosc tablic (powinna byc podzielna przez 4)
6
+#define tab_length 60
7
+
8
+unsigned long rdtsc();
9
+void suma_c(int tab1[], int tab2[], int wynik[], long int length);
10
+void suma_sse(int tab1[], int tab2[], int wynik[], long int length);
11
+
12
+int main()
13
+{
14
+    int tab1[tab_length], tab2[tab_length];
15
+    int wynik_c[tab_length], wynik_sse[tab_length];
16
+    int i;
17
+    
18
+    unsigned long time_start, time_stop;
19
+    unsigned long time_c, time_sse;
20
+    double acc;
21
+    
22
+    printf("Liczba elementow w tablicach: %d\n", tab_length);
23
+    
24
+    // Losowanie danych
25
+    srand(time(NULL));
26
+    for(i = 0; i < tab_length; i++)
27
+    {
28
+        tab1[i] = rand() % 101;
29
+        tab2[i] = rand() % 101;
30
+    }
31
+    
32
+    // Suma - C
33
+    printf("Sumowanie - C...\t");
34
+    time_start = rdtsc();
35
+    suma_c(tab1, tab2, wynik_c, tab_length);
36
+    time_stop = rdtsc();
37
+    time_c = time_stop - time_start;
38
+    printf("OK\n");
39
+    
40
+    // Suma - SSE (asembler)
41
+    printf("Sumowanie - SSE...\t");
42
+    time_start = rdtsc();
43
+    suma_sse(tab1, tab2, wynik_sse, tab_length);
44
+    time_stop = rdtsc();
45
+    time_sse = time_stop - time_start;
46
+    printf("OK\n");
47
+    
48
+    acc = (double)time_c / (double)time_sse;
49
+    
50
+    // Wyswietlenie wynikow
51
+    if(tab_length <= 60)
52
+    {
53
+        // Zawartosc tablic - do kontroli, jezeli sa krotkie
54
+        printf("\n\t\tC\tSSE\n");
55
+        for(i = 0; i < tab_length; i++)
56
+        {
57
+            printf("%d+%d\t=\t%d\t%d\n", tab1[i], tab2[i], wynik_c[i], wynik_sse[i]);
58
+        }
59
+    }
60
+    
61
+    printf("\nCzas sumowania (TSC) - C:\t%lu\n", time_c);
62
+    printf("Czas sumowania (TSC) - SSE:\t%lu\n", time_sse);
63
+    printf("%fx szybciej\n", acc);
64
+    
65
+    return 0;
66
+}
67
+
68
+void suma_c(int tab1[], int tab2[], int wynik[], long int length)
69
+{
70
+    int i;
71
+    
72
+    for(i = 0; i < length; i++)
73
+    {
74
+        wynik[i] = tab1[i] + tab2[i];
75
+    }
76
+}

+ 36
- 0
lab6/suma_sse.s Voir le fichier

@@ -0,0 +1,36 @@
1
+# Jan Potocki 2019
2
+# Suma 2 tablic liczb int (32-bitowych) za pomoca jednostki SSE
3
+
4
+.globl suma_sse
5
+.type sume_sse, @function
6
+
7
+suma_sse:
8
+pushq %rbp                      # Wejscie do funkcji
9
+movq %rsp, %rbp
10
+
11
+# rdi - wskaznik na 1. tablice
12
+# rsi - wskaznik na 2. tablice
13
+# rdx - wskaznik na tablice przeznaczona na wynik
14
+# rcx - dlugosc tablic
15
+
16
+# Obliczenie dlugosci tablicy w bajtach (ograniczenie petli)
17
+pushq %rdx                      # Zapisanie wartosci rdx na stosie
18
+movq %rcx, %rax                 # Przygotowanie mnozenia...
19
+movq $4, %rcx                   # int = 4 bajty (w modelu danych LP64)
20
+mulq %rcx                       # Mnozenie (wynik w rdx:rax)
21
+popq %rdx                       # Przywrocenie wartosci rdx ze stosu
22
+
23
+# Sumowanie wektorowe
24
+mov $0, %r8                     # r8 - indeks petli
25
+
26
+suma:
27
+movdqu (%rdi, %r8, 1), %xmm0    # xmm0 - 4 liczby z pierwszej tablicy
28
+movdqu (%rsi, %r8, 1), %xmm1    # xmm1 - 4 liczby z drugiej tablicy
29
+paddd %xmm1, %xmm0              # Rownoczesna suma 4 liczb
30
+movdqu %xmm0, (%rdx, %r8, 1)    # Zapisanie wyniku w pamieci
31
+add $16, %r8                    # Przesuniecie o 16 bajtow (4x int)
32
+cmp %rax, %r8                   # sprawdzenie czy osiagnieto koniec tablicy
33
+jne suma
34
+
35
+popq %rbp                       # Wyjscie z funkcji
36
+ret

Loading…
Annuler
Enregistrer