background image

WOJSKOWA AKADEMIA TECHNICZNA

Architektura i organizacja komputerów II

Sprawozdanie z pracy laboratoryjnej

Nr 7

Student : Adrian Kępa
Grupa   : I3X6S1
Nr         : 14
Data      : 23.05.2014r.

background image

Treść zadania

 

Zadanie laboratoryjne 7_8:

A

. Napisać program Lab7.s w asemblerze komputera DLX, który:

1

. Zadeklaruje dwie tablice przechowujące liczby całkowite: T 110- elementową oraz 

TB Rozmiar-elementową (gdzie liczba Rozmiar jest podana w tabeli z punktu A3), a 
także zmienną Suma zmiennoprzecinkową podwójnej precyzji.

2

. Komórki tablicy T wypełni rosnąco kolejnymi liczbami całkowitymi począwszy od 

numeru w dzienniku studentki/ studenta, powiększonego o liczbę SKŁADNIK, o 
wartości podanej poniżej (np. dla numeru 10, TA będzie zawierać kolejne liczby 
całkowite 10+SKŁADNIK, 11+SKŁADNIK,…)

3

. Następnie dla każdego elementu tablicy TB wykona operację : 

Wersja : 

10

Operacja : 

(T[i+7] + T[i+9] - T[i+3])* SKŁADNIK

Składnik : 

190

Rozmiar tablicy TB : 

80

Numer studenta : 

14

4

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

B

. Przed napisaniem programu Lab7.s zaprojektować arkusz kalkulacyjny w Excelu (lub innym 

arkuszu kalkulacyjnym), wykonujący te same obliczenia. Porównać wyniki z arkusza z wynikami 
napisanego programu Lab7.s.

C

. Zmierzyć liczbę cykli zegarowych dla wykonania uzyskanego programu przy 1)załączonym 

2)wyłączonym forwardingu (WinDLX, menu Configuration/ Enable Forwarding). Wyniki 
pomiarów przedstawić w postaci tabeli. Dla każdego uruchomienia sprawdzić poprawność 
obliczonej zmiennej Suma

D

. W sprawozdaniu naszkicować (lub wydrukować) i porównać diagramy cykli zegarowych dla 

wykonania jednej iteracji obliczeń z punktu A3 (TB[i] = …) dla konfiguracji: 1) Forwarding 
Enabled
 i 2) Forwarding Disabled. Opisać występujące w tej iteracji hazardy i przyczyny ich 
powstania. Na podstawie analizy diagramów cykli zegarowych obliczyć liczbę cykli zegarowych, 
liczbę instrukcji i CPI (Clock cycles Per Instruction = liczba cykli zegarowych / liczba 
wykonanych instrukcji) dla całego programu dla obu wybranych konfiguracji. Wyniki obliczeń 
porównać z zawartością okienka Statistics programu WinDLX.

background image

Kod programu

.data

skladnik:        .word       190
numerstud:    .word       14
a:                   .word       110     
b:                   .word       80      
T:                   .space      440
TB:

         .space      320

Suma:           .double     4

.text

pierwszyelem:
     addi R9, R0, T             
     lw R4, skladnik         
     lw R5, numerstud        
     add R4, R4, R5         
     sw 0(R9), R4           
     lw R20, a              
     addi R1,R1,1

   

     addi R2, R0, 0        

wypelnianie_T:
     subi R20, R20, #1       
     sw 0(R9), R4            
     add R4, R4, R1          
     addi R9, R9, #4        
     bnez R20, wypelnianie_T 

przygotowanie_do_sumy:
     addi R10, R0, T                
     lw R19, b               
     lw R28, skladnik        
     addi R7, R0, TB         
     addi R26, R0, 0        

obliczenia:
     lw R5, 28(r10)               
     lw R6, 36(r10)          
     lw R15, 12(r10)        
     add R8, R5, R6          
     sub R8, R8, R15         
     mult R16, R8, R28       
     addi R10, R10, #4       
     subi R19, R19, #1      
     sw 0(R7), R16                      
     addi R7, R7, #4         
     add R26, R16, R26       
     bnez R19, obliczenia    

movi2fp F10, R26             
cvti2d F10, F10             
sd Suma, F10             

trap 0                      

background image

Opis programu

Program Lab7.s ma za zadanie wypełnić komórki tablicy T kolejnymi liczbami począwszy od 
liczby SKLADNIK + NUMER STUDENTA. W tym przypadku jest to 204. Następnie, każdy 
element tablicy TB zostaje wyliczony na podstawie wzoru :

(T[i+7] + T[i+9] - T[i+3])* SKŁADNIK

Ostatnią częścią programu jest zsumowanie wszystkich elementów tablicy TB i zapisanie ich w 
zmiennej Suma.

Pierwsze 10 elementów tablic T i TB

T[i]

TB[i]

204

41230

205

41420

206

41610

207

41800

208

41990

209

42180

210

42370

211

42560

212

42750

213

42940

Ostatnie 10 elementów tablic T i TB

T[i]

TB[i]

304

54530

305

54720

306

54910

307

55100

308

55290

309

55480

310

55670

311

55860

312

56050

313

56240

background image

Pozostałe dane

Numer 

Studenta

Składnik

TB[1]

TB[80]

Suma

14

190

41230

56240

3,89880E+06

Zawartość pamięci dla 

włączonego 

forwardingu.

background image
background image

Zawartość pamięci dla 

wyłączonego

 

forwardingu.

background image
background image

Obliczenia

A

. Ilość instrukcji – 

 

 Taka sama dla włączonego i wyłączonego forwardingu.

 

 

-8 instrukcji początkowych

-Pętla wypełniająca tablicę T zawierająca 5 instrukcji, wykonuje się 110 razy, więc w samej pętli 
wykona się 550 instrukcji.

-Następnie w etykiecie przygotowanie_do_sumy wykona się 5 instrukcji.

-Pętla obliczenia zawierająca 12 instrukcji, wykonuje się 80 razy więc w samej pętli wykona się 
960 instrukcji.

-Końcowa faza programu zawiera 4 instrukcje.

-Razem wszystkich instrukcji wykonanych podczas działania programu = 
8 + 550 + 5 + 960 + 4 = 

 

 

1527

 

 

B

. CPI (

 

 Clock Cycles Per Instruction

 

 )   FORWARDING ON

CPI = ilosc cykli / ilosc instrukcji
CPI
 = 1880/1527 = 

1,23

C

. CPI (

 

 Clock Cycles Per Instruction

 

 )   FORWARDING OFF

CPI = ilosc cykli / ilosc instrukcji
CPI
 = 2448/1527 = 

1,60

Porównanie wyników

Forwarding

ON

OFF

Ilość cykli

1880

2448

Ilość instrukcji

1527

1527

Clock cycles per instr.

1,23

1,60

Zmienna Suma

3,89880E+006

3,89880E+006

background image

Forwarding ON

Na powyższym zdjęciu zamieściłem wycinek cyklu zegarowego wykonanego programu dla pętli 
obliczającej elementy tablicy TB. Hazard występuje w momencie gdy rozkaz 

sw 0(R7), R16

 chce 

skorzystać z rejestru R16 który z kolei jest wcześniej wykorzystywany poprzez rozkaz  

mult R16, 

R8, R29

. W WinDLX mnożenie trwa aż 5 cykli, dlatego rozkaz 

sw 0(R7), R16

 musiał odczekać 2 

cykle by mnożenie w poprzednim rozkazie zostało wykonane. Rozkaz 

addi R7, R7, #4

 również 

musi odczekać 2 cykle, by skorzystać z rejestru R7 zależnego od poprzedniego hazardu.

background image

Forwarding OFF

Powyższe zdjęcie ilustruje przebieg programu bez forwardingu. Oprócz hazardów opisanych dla 
poprzedniego przypadku, występują nowe. Na przykład – 

add R8, R5, R6

 chce skorzystać z 

rejestru R6 do którego ładowany jest element tablicy. Z kolei rejestr ten jest  obsługiwany przez 
rozkaz 

lw R6, 36(R10)

 i występuje tutaj hazard typu RAW. Kolejny dodatkowy hazard ma miejsce 

już w następnym rozkazie – 

sub R8, R8, R15

 który to rozkaz jest w hazardzie z rozkazem 

add R8, R5, R6

. Rozkaz mult 

R16, R8, R20

 również próbuje skorzystać z rejestru R8 ale jest 

uzależniony zarówno od rozkazu 

sub R8, R8, R15

 jak i 

add R8, R5, R6

.

background image

Wnioski

Na podstawie powyższych danych i obliczeń widać, że forwarding to mocne narzędzie które potrafi 
przyspieszyć i zoptymalizować działanie komputera. Włączenie/wyłączenie forwardingu dla 
badanego programo spowodowało zmianę ilości wykonywanych cykli i zauważalnie zwiększony 
czas wykonywania programów. Dodatkowo, wyłączony forwarding przyczynił się do powstania 
większej ilości hazardów, które to spowalniały pracę programu. Dla danego programu, wynik 
zapisany w zmiennej Suma nie zmieniał się przy wyłączaniu/włączaniu forwardingu.