3958


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:

  1. 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.

  2. 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.).

  3. 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]]

  1. W zmiennej Suma umieści sumę wszystkich elementów tablicy TB.

  2. Przed rozpoczęciem tworzenia programu zaprojektować arkusz kalkulacyjny w Excelu lub innym arkuszu kalkulacyjnym, wykonujący te same obliczenia.

2. Algorytm

0x01 graphic

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

0x01 graphic

b) 10 ostatnich elementów tablicy T

0x01 graphic

c) 10 ostatnich elementów tablicy TB (na jasnym kolorze elementy TB)

0x01 graphic

d) suma z arkusza kalkulacyjnego

0x01 graphic


5. Wydruk z podglądu zawartości pamięci operacyjnej WinDLX

forwarding on:


0x01 graphic


0x01 graphic

0x01 graphic


0x01 graphic

0x01 graphic


0x01 graphic

0x01 graphic


forwarding off:


0x01 graphic

0x01 graphic



0x01 graphic

0x01 graphic


0x01 graphic

0x01 graphic



0x01 graphic

0x01 graphic


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

0x01 graphic

1/1/1 forwarding off

0x01 graphic


Diagramy cykli zegarowych:

Konfiguracja szybka:

0x01 graphic

0x01 graphic

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:

0x01 graphic

0x01 graphic

0x01 graphic

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



Wyszukiwarka