Klausurlösung Rechnerarchitektur WS 11/12

Diskussionen rund um Themen und Veranstaltungen des 5. Bachelor-Semesters

Moderator: (M) Mod.-Team Allgemein

Antworten
Basman
TalkING. Fan
TalkING. Fan
Beiträge: 71
Registriert: Sa, 09. Jan. 10, 15:02

Klausurlösung Rechnerarchitektur WS 11/12

Beitrag von Basman » Fr, 17. Aug. 12, 12:29

Da es keine offizielle Lösung gibt wollte ich vorschlagen eine gemeinsam zu entwickeln.
Achtung!! Das sind meine eigenen Lösungen, diese müssen nicht korrekt sein.

Aufgabe 1)
gegeben sind 4 * 18x18 signed Multiplizierer die auch noch vorzeichenbehaftet sein sollen.
Aufspliten in:
a0,a1,b0,b1 = 17Bit
sa,sb = 1Bit (Vorzeichenbit)
Kann man das einfach so voneinander trennen?
Die beiden Vorzeichenbits könnte man mit einem XOR verknüpfen und sobald das XOR 1 ergibt muss das Endergebnis Invertiert werden.
Weiter komme ich bei dieser Aufgabe leider nicht, sollte aber Ähnlickeit mit der Übungsaufgabe 2 haben.

Aufgabe 2)
a) x = a AND b

Code: Alles auswählen

   SET X   /setzt X = 1 
A: TST a
   JPC B    //jump wenn a = 1 
   RST x   //x = 0 wenn a != 1

B: TST b
   JPC END  //jump wenn b = 1
   RST x     //x = 0 wenn b != 1

END:
x = a OR b

Code: Alles auswählen

     SET x   //setzt x = 1
A:   TST a
     JPC END  //jump zum ende sobald a = 1
B:   TST b
     JPC END  //jump zum ende sobald b = 1
NOT: RST x
END:
x = a XOR b

Code: Alles auswählen

    SET x   //setzt x = 1
A: TST a
    JPC B   //jump zu B falls a = 1
    RST x  //setzt x = 0 wenn a = 0

B: TST b
    JPC T  //jump zu T wenn b = 1
    TST x
    JPC END //jump zum ende wenn x = 1 => a = 1 und b = 0

R: SET a   //Zustand wird nur erreicht wenn a,b = 0, 
    TST a
    JPC END //bedingungsunabhäniger Sprung

T: TST x   
    JPC NOT  //wenn x = 1 => a,b = 1
    SET x     //Zustand wird nur erreicht wenn: a = 0, b = 1. Setzt x =1
    TST x
    JPC END  //Überspringt NOT

NOT: RST X //Setzt x = 0
END:

//edit
Aufgabe 2)
b)

Code: Alles auswählen

begin
  signal flag: std_logic = 0;
  signal code_counter : std_logic_vector (15 downto 0);
 process(clk, reset)
   begin
     if reset = '1' then 
       AI <X> '0'&#41;;
       RnW <= 1;
     elseif clk'event and clk = '1' then
      if I&#40;17 downto 15&#41; = '00' then
        AD <= I&#40;15 downto 0&#41;;
        Dout <= '0';
        RnW <= '0';  
        AI <= code_counter;
       end if;
      if I&#40;17 downto 15&#41; = '01' then
        AD <= I&#40;15 downto 0&#41;;
        Dout <= '1';
        RnW <= '0';
        AI <= code_counter;
       end if;
       if I&#40;17 downto 15&#41; = '10' then
        AD <= I&#40;15 downto 0&#41;;
        RnW <= '1';
        flag <= Din;
        AI <= code_counter;
       end if;
         if I&#40;17 downto 15&#41; = '11' then
            if flag = '1' then
               AI <= I&#40;15 downto 0&#41;;
             else
                AI <= code_counter;
             end if;
      code_counter += 1;
     end if;
  end process;
end behaviour
Aufgabe 3)
a)
Ro = 1024 (Konstante)
R2 = 1 (Konstante)
R3 = Index Zahl (i)
R5 = x
R6 = a
R7 = b

Code: Alles auswählen

scalar&#58; R0 = 1024
	R2 = 1
	R3 = 1024
WHILE&#58;	R6 = R3
	R7 = R0 + R3
	R6 = mem&#40;R6&#41;
	R7 = mem&#40;R7&#41;
	F6 = F6 * F7
	R5 = R5 + R6
	R3 = R3 - R2
	jmp NZ, END
	nop
	jmp WHILE
	nop
END&#58;	
b) wie funktioniert das mit den Pipes? In der Probeklausur wurde mit den Akku's gerechnet, ist das auch hier gemeint?

c) Wird noch überarbeitet
Zuletzt geändert von Basman am Fr, 17. Aug. 12, 15:16, insgesamt 1-mal geändert.

Lks
TalkING. Freak
TalkING. Freak
Beiträge: 113
Registriert: Sa, 03. Okt. 09, 20:11

Beitrag von Lks » Fr, 17. Aug. 12, 13:18

Habs gerade nur überflogen aber bei Aufgabe 3 haut R0 = 1024 nicht hin, da du nicht 1024 als Konstante reinladen kannst. Ich würde
R0 = 128;
nop;
R0 *= 8;
machen.

/edit: Da ist noch ein wenig mehr im argen. Die Multiplikationen müssten auf der FPU ausgeführt werden, da x, a und b floats sind. Das solltest du nochmal überarbeiten.

Grüße

Basman
TalkING. Fan
TalkING. Fan
Beiträge: 71
Registriert: Sa, 09. Jan. 10, 15:02

Beitrag von Basman » Fr, 17. Aug. 12, 13:41

bei dem 1. Kritikpunkt gebe ich dir absolut recht, man kann ja nur eine 9-Bit Konstante reinladen {-256,...,0,..,+255} das hab ich nicht beachtet.

Die Multiplikation wird doch auf dem FPU ausgeführt:

"F6 = F6 * F7"

Laut dem Satz: "Bei einer Memory-Load Operation werden die ALU-Register Rx sowie Floating-Point-Register Fx ebenfalls in der WB-Phase aktualisiert"

Das hatte ich so interpretiert, das bei dem Memory laden Rx = mem(Ry) auch der Float Register Fx den selben Wert bekommt. Ist dies nicht der Fall?
Wenn nicht dann wird auch noch eine Übertragung vom FPU zum CPU notwendig oder nicht?

//EDIT
Lösungsvorschlag 2:
Ro = 128 (Konstante)
R2 = 1 (Konstante)
R3 = Index Zahl (i)
F5 = x
F6 = a
F7 = b

Code: Alles auswählen

scalar&#58; R0 = 128
	nop;
	R0* = 8;
   	R2 = 1 
   	R3 = R0 
        F5 = 0
WHILE&#58;  R6 = R3 
   	R7 = R0 + R3 
   	F6 = mem&#40;R6&#41; 
   	F7 = mem&#40;R7&#41; 
        nop
   	F6 = F6 * F7 
        nop
   	F5 = F5 + F6 
   	R3 = R3 - R2 
   	jmp NZ, END 
   	nop 
   	jmp WHILE 
   	nop 
END&#58;    
So ist momentan das Ergebnis als Float im FPU
Zuletzt geändert von Basman am Fr, 17. Aug. 12, 15:14, insgesamt 1-mal geändert.

Lks
TalkING. Freak
TalkING. Freak
Beiträge: 113
Registriert: Sa, 03. Okt. 09, 20:11

Beitrag von Lks » Fr, 17. Aug. 12, 14:14

Schaut für mich jetzt besser aus. Ich würde allerdings noch einige nops hinzufügen.

Grüße

Basman
TalkING. Fan
TalkING. Fan
Beiträge: 71
Registriert: Sa, 09. Jan. 10, 15:02

Beitrag von Basman » Fr, 17. Aug. 12, 17:33

Aufgabe 3 b)

Programm besitzt 4 FPU aufrufe pro Schleifendurchlauf + 1 am Anfang
Die While Schleife besitzt 13 Zeilen, die Einleitung 6
n = 1024 Durchläufe
E = (1 + 4 *n) / (6 + 13*n) = 0,30 = 30%

Aufgabe 3 c)

R0 = 512
R1 = 1024
R2 = 1
R3 = i
F5 = ai * bi
F6 = ai
F7 = bi
F8 = ai+512
F9 = bi+512
F10 = ai+512 * bi+512

Code: Alles auswählen


scalar&#58; Ro = 128
	R2 = 1
	R0* = 4 &#40;512&#41;
	R1 = R0
	R3 = R0
	R1 *= 2 &#40;1024&#41;
	F5 = 0
	F10 = 0
WHILE&#58;  R6 = R3
	R7 = R1 + R3
	R8 = R0 + R3
	R9 = R0 + R1
	F6 = mem&#40;R6&#41;
	R9 = R9 + R3
	F7 = mem&#40;R7&#41;
	F8 = mem&#40;R8&#41;
	F9 = mem&#40;R9&#41;
	F6 = F6 * F7
	F8 = F8 * F9
	F5 = F5 + F6
	F10 = F10 + F8
	R3 = R3 - R2
	Jmp NZ, END
	nop;
	jmp WHILE
	nop;
END&#58;	F11 = F10 + F5
n = 512
E = (2+1+8*n) / (8+18*n +1) = 0,44 = 44%
Eine eindeutige Effizienz Steigerung der FPU Auslastung

Basman
TalkING. Fan
TalkING. Fan
Beiträge: 71
Registriert: Sa, 09. Jan. 10, 15:02

Beitrag von Basman » Di, 21. Aug. 12, 11:42

Aufgabe 1)
Siehe Übungaufgabe 2:
die Grenzen der Eingangssignale: [2^0,..,2^17]
Grenzen des Ergebnisses mit Überlegung oder durch die Multiplikationsformel für 2er Kompliment (siehe Foliensammlung oder Probeklausur) ermitteln.
Bei Überscheidungen benötigt man einen Addierer.
b)
Algorithmus von Karatsuba anwenden


Aufgabe 2)
a) x = a AND b

Code: Alles auswählen

   SET X   /setzt X = 1 
A&#58; TST a 
   JPC B    //jump wenn a = 1 
   RST x   //x = 0 wenn a != 1 

B&#58; TST b 
   JPC END  //jump wenn b = 1 
   RST x     //x = 0 wenn b != 1 

END&#58; 
x = a OR b

Code: Alles auswählen

     SET x   //setzt x = 1 
A&#58;   TST a 
     JPC END  //jump zum ende sobald a = 1 
B&#58;   TST b 
     JPC END  //jump zum ende sobald b = 1 
NOT&#58; RST x 
END&#58; 
x = NOT a

Code: Alles auswählen

TST a
JPC NOT
SET x
TST x
JPC END

NOT&#58; RST x

END&#58;
Aufgabe 2)
b)

Code: Alles auswählen


begin 
  signal flag&#58; std_logic = 0; 
  signal code_counter &#58; std_logic_vector &#40;15 downto 0&#41;; 
 process&#40;clk, reset&#41; 
   begin 
     if reset = '1' then 
       AI <X> '0'&#41;; 
       RnW <= 1; 
     elseif clk'event and clk = '1' then 
      if I&#40;17 downto 15&#41; = '00' then 
        AD <= I&#40;15 downto 0&#41;; 
        Dout <= '0'; 
        RnW <= '0';  
        AI <= code_counter; 
       end if; 
      if I&#40;17 downto 15&#41; = '01' then 
        AD <= I&#40;15 downto 0&#41;; 
        Dout <= '1'; 
        RnW <= '0'; 
        AI <= code_counter; 
       end if; 
       if I&#40;17 downto 15&#41; = '10' then 
        AD <= I&#40;15 downto 0&#41;; 
        RnW <= '1'; 
        flag <= Din; 
        AI <= code_counter; 
       end if; 
         if I&#40;17 downto 15&#41; = '11' then 
            if flag = '1' then 
               AI <= I&#40;15 downto 0&#41;; 
             else 
                AI <= code_counter; 
             end if; 
      code_counter += 1; 
     end if; 
  end process; 
end behaviour; 
Aufgabe 3)
Worauf ist zu achten:
Die Zuweisung eines FPU Wertes erfolgt erst nach 3 Taktzyklen, die Wertzuweisung eines CPU Registers erfolgt nach 2 Taktzyklen
Es können nur 4 FPU Operationen zur Zeit bearbeitet werden.

Ro = 128 (Konstante)
R2 = 1 (Konstante)
R3 = Index Zahl (i)
F5 = x
F6 = a
F7 = b

Code: Alles auswählen

scalar&#58; R0 = 128 
   nop;
   nop;
   R0* = 8; 
      R2 = 1 
      F5 = 0
      R3 = R0  
WHILE&#58;  R6 = R3 
      nop
      R7 = R0 + R3 
      F6 = mem&#40;R6&#41; 
      F7 = mem&#40;R7&#41; 
      nop
      nop
      nop 
      F6 = F6 * F7 
      nop
      nop
      nop
      F5 = F5 + F6 
      R3 = R3 - R2 
      nop
      nop
      jmp NZ, END 
      nop 
      jmp WHILE 
      nop 
END&#58;    
b)
E = verwendete FPU Befehle / Gesamtanzahl aller Befehle
n = 1024
E = (1 + n*4) / (7 + n*20)

c)
R0 = 512
R1 = 1024
R2 = 1
R3 = i
F5 = ai * bi
F6 = ai
F7 = bi
F8 = ai+512
F9 = bi+512
F10 = ai+512 * bi+512

Code: Alles auswählen

scalar&#58; Ro = 128 
   F5 = 0 
   R2 = 1 
   R0* = 4 &#40;512&#41; 
   F10 = 0
   nop
   R1 = R0 
   R3 = R0 
   nop
   R1 *= 2 &#40;1024&#41; 
WHILE&#58;  R6 = R3 
   nop
   nop
   R7 = R1 + R3 
   R8 = R0 + R3 
   R9 = R0 + R1 
   F6 = mem&#40;R6&#41;    
   F7 = mem&#40;R7&#41; 
   R9 = R9 + R3
   F8 = mem&#40;R8&#41; 
   nop
   F9 = mem&#40;R9&#41; 
   F6 = F6 * F7 
   nop
   nop
   F8 = F8 * F9 
   F5 = F5 + F6 
   R3 = R3 - R2
   nop 
   F10 = F10 + F8 
   Jmp NZ, END 
   nop; 
   jmp WHILE 
   nop; 
END&#58;   F11 = F10 + F5 
n = 512
E = (2 + n* 8 + 1) / (10 + 1 +n*24)[/code]

Propper
TalkING. Newbie
TalkING. Newbie
Beiträge: 15
Registriert: Di, 20. Jul. 10, 18:55

Beitrag von Propper » Mi, 22. Aug. 12, 12:25

Moin,

ich hätte bei Aufgabe 3 auch noch eine Frage zum Pipelining:

Beide Pipelines haben 4 Stufen, d.h. doch eigentlich, dass sämtliche Änderungen an Registern erst nach 4 weiteren Befehlen wirksam werden, also z.b.:

Code: Alles auswählen

1 R0 = R0 + R1 &#40;IF&#41;
2 nop &#40;ID&#41;
3 nop &#40;EX&#41;
4 nop &#40;WB&#41;
5 ----- Hier könnte der neue Wert von R0 verwendet werden.
Gilt das auch für direkte Zuweisungen einer Konstanten, z.b.:

Code: Alles auswählen

1 R0 = 128 &#40;IF?&#41;
2 nop &#40;ID?&#41;
3 nop &#40;EX?&#41;
4 nop &#40;WB?&#41;
5 ----- Ist hier die 128 erst gespeichert?
Oder ist der Wert schon in Zeile 2 im Register?

Und was genau für einen Unterschied macht es, dass die Register in der CPU-Pipeline erst in der zweiten Stufe gelesen werden, bei der FPU aber schon in der ersten? Ändert das irgendetwas an der Anzahl an Befehlen, die man warten muss, bis der neue Wert gültig ist?

Basman
TalkING. Fan
TalkING. Fan
Beiträge: 71
Registriert: Sa, 09. Jan. 10, 15:02

Beitrag von Basman » Mi, 22. Aug. 12, 14:25

@Propper
Ja es macht einen unterschied ob es in der ersten oder der 2. Stufe gelesen wird. Du kannst schon ein Register in den IF laden der ein Register aus der WB benötigt, siehe Bsp.

BsP:
R0 = 7
nop
nop
R1 = R1 + R0

Code: Alles auswählen

|IF|ID|EX|WB|
|R0|  |  |   |
|  |R0|  |   |
|  |  |R0|   |
|R1|  |  |R0 |
BsP:
F0 = 7
nop
nop
nop
F1 = F1 + F0

Code: Alles auswählen

|EX1|EX2|EX3|Ex4|
|F0 |   |   |   |   
|   |F0 |   |   |
|   |   |F0 |   |
|   |   |   |F0 |
|F1 |   |   |   |
Laut der Aussage eines Mitarbeiters des Institutes kannst du das laden einer Konstante als ALU Operation ansehen, solltest es am besten aber hinschreiben.

Antworten