WOJSKOWA AKADEMIA TECHNICZNA
Architektura i organizacja komputerów II
Sprawozdanie z pracy laboratoryjnej
Nr9-10
Grupa: I0X3S1
Autor: Karolina Dembek
Nr 19
Data: 2011-06-04
1. Treść zadania
Napisać program Lab9.s w asemblerze komputera DLX, który:
Zadeklaruje dwie tablice przechowujące liczby zmiennoprzecinkowe podwójnej precyzji: T 130- elementową oraz TB ROZMIAR-elementową, a także zmienną Suma zmiennoprzecinkową podwójnej precyzji.
Komórki tablicy T wypełni (za pomocą obliczeń, wykonanych w pętli, a nie za pomocą statycznej deklaracji z nadaniem wartości początkowych) kolejnymi liczbami o części ułamkowej równej UŁAMEK i części całkowitej rosnącej o jeden, począwszy od numeru w dzienniku studenta/ studentki, powiększonej o SKŁADNIK (np. nr=1; UŁAMEK = 0.35; SKŁADNIK = 5;
w tablicy T mają być zapisane liczby T[1] = 6.35, T[2] = 7.35 itd.).
Następnie dla każdego elementu tablicy TB wykona operację, określoną w poniższej tabeli (UWAGA: wszystkie występujące we wzorze działania mają być jawnie wykonane w programie, nie są dopuszczalne przekształcenia wzoru (np. skrócenia), zastępowanie wykonywania działań obliczonymi stałymi. Można użyć stałych dla reprezentowania w programie wartości numeru w dzienniku i danych SKŁADNIK i UŁAMEK):
SKŁADNIK = 201
UŁAMEK = 0,97
ROZMIAR = 110
TB[i] = [((2*T[i+7]) + T[i+1]+T[i+2])*(T[i+3])+T[i+4])]/[T[i+5]]
W zmiennej Suma umieści sumę wszystkich elementów tablicy TB.
Przed rozpoczęciem tworzenia programu zaprojektować arkusz kalkulacyjny w Excelu lub innym arkuszu kalkulacyjnym, wykonujący te same obliczenia.
2. Algorytm
3. Kod programu lab9.s
.data
licznikT: .word 130
licznikTB: .word 110
suma: .space 8
ulamek: .double 0.97
skladnik: .double 201
nr: .double 19
one: .double 1.0
stala: .double 2.0
T: .space 1040
TB: .space 880
.text
ld f2,nr
ld f4,skladnik
ld f6,ulamek
ld f8,one
ld f30,suma
addi r1,r0,T
addi r2,r0,TB
lw r5,licznikT
lw r6,licznikTB
addd f14,f2,f6
addd f12,f14,f4
wypelnijT:
sd 0(r1),f12
addi r1,r1,#8
subi r5,r5,#1
addd f12,f12,f8
bnez r5,wypelnijT
addi r1, r0, T
wypelnijTB:
; [((2*T[i+7]) + T[i+1]+T[i+2])*(T[i+3])+T[i+4])]/[T[i+5]]
ld f2,56(r1) ;T[i+7]
ld f4,8(r1) ;T[i+1]
ld f6,16(r1) ;T[i+2]
ld f8,24(r1) ;T[i+3]
ld f10,32(r1) ;T[i+4]
ld f12,40(r1) ;T[i+5]
ld f14,stala
multd f16,f14,f2 ;stala * [i+7]
addd f18,f8,f10 ;[i+3] + [i+4]
addd f20,f4,f6 ;[i+1] + [i+2]
addd f22,f16,f20
multd f24,f22,f18
divd f26,f24,f12
addd f30,f30,f26
sd 0(r2),f26
addi r2, r2, #8
addi r1, r1, #8
subi r6,r6,#1
bnez r6,wypelnijTB
addi r3,r0,suma
sd 0(r3),f30
trap 0
Mój kod z laboratoriów jednak zawierał pętle w pętli przy wypełnianiu tablicy T. Nie jest to jednak zbyt „eleganckie” i czytelne rozwiązanie (ciężej je analizować ponieważ pętle się krzyżują). Można je zastąpić używając większą liczbe rejestów do obliczenia pierwszego elementu tablicy T i w pętli wstawić wynik do tablicy. Co też prezentuje powyższy kod.
4. Wyniki z arkusza kalkulacyjnego
a) 10 pierwszych elementów tablic T, TB
b) 10 ostatnich elementów tablicy T
c) 10 ostatnich elementów tablicy TB (na jasnym kolorze elementy TB)
d) suma z arkusza kalkulacyjnego
5. Wydruk z podglądu zawartości pamięci operacyjnej WinDLX
6. Porównanie wyników dla różnych konfiguracji:
forwarding on:
forwarding off:
Przy włączonym forwardingu liczba cykli zegarowych zmienia się z 7316 na 5788. Zmiany w konfiguracji ilości jednostek arytmetycznych nie powodują żadnych zmian w ilości cykli czy instrukcji.
Suma jest liczona poprawnie zarówno przy włączonym, jak i wyłączonym forwardingu oraz przy dowolnej konfiguracji jednostek arytmetycznych. Wyłącznie forwarding wpływa na ilość wykonanych cykli, zmniejszając ją.
Liczba cykli w wersji szybszej: 6080
Liczba instrukcji w wersji szybszej: 2755
CPI dla wersji szybszej: 2,2
Liczba cykli w wersji wolniejszej: 7316
Liczba instrukcji w wersji wolniejszej: 2755
CPI dla wersji wolniejszej: 2,65
7. Wersja szybka i wersja wolna:
1/1/1 forwarding on
1/1/1 forwarding off
Diagramy cykli zegarowych:
Konfiguracja szybka:
Występują hazardy strukturalne oraz hazardy typu RAW:
addd f22,f16,f20 czeka na wynik multd f16,f14,f2
multd f24,f22,f18 czeka na wynik addd f18,f8,f10
multd f24,f22,f18 czeka na wynik addd f22,f16,f20
addd f22,f16,f20 czeka na wynik addd f20,f4,f6
divd f26,f24,f12 czeka na wynik multd f24,f22,f18
addd f30,f30,f26 czeka na wynik divd f26,f24,f12
bnez r6, wypelnijTB czeka na subi r6,r6,#1
Jedna pętla TB
Instrukcji - 19
Liczba wykonan TB - 110
Jedna pętla T
Instrukcji - 5
Liczba wykonan T - 130
Dodatkowe instrukcje - 15
Instrukcji: 110*19 + 130*5 + 15 = 2755
Cykli: 6080
CPI: 2,2
Konfiguracja wolna:
Występują hazardy strukturalne oraz hazardy typu RAW:
addd f22,f16,f20 czeka na wynik multd f16,f14,f2
multd f24,f22,f18 czeka na wynik addd f18,f8,f10
multd f24,f22,f18 czeka na wynik addd f22,f16,f20
addd f22,f16,f20 czeka na wynik addd f20,f4,f6
divd f26,f24,f12 czeka na wynik multd f24,f22,f18
addd f30,f30,f26 czeka na wynik divd f26,f24,f12
bnez r6, wypelnijTB czeka na subi r6,r6,#1
Jedna pętla TB
Instrukcji - 19
Liczba wykonan TB - 110
Jedna pętla T
Instrukcji - 5
Liczba wykonan T - 130
Dodatkowe instrukcje - 15
Instrukcji: 110*19 + 130*5 + 15 = 2755
Cykli: 7316
CPI: 2,65