АОР2/Јун 2023

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

Јунски рок 2023. године одржан је 5. јуна и трајао је 120 минута.

1. задатак

Поставка

[5п] Описати технику оптимизације векторских инструкција која се заснива на коришћењу регистра маски вектора (Vector mask registers). На примеру израчунавања максимума кореспондентних елемената низа (Z[i] = MAX(X[i], Y[i])) приказати коришћење овог регистра.

Решење

Регистар маске вектора служи како би се одређене операције над векторима извршиле само над њиховим одређеним члановима, тиме што на одређеним битовима регистра маске стоје нуле или јединице. На пример, следећи код за рачунање максимума:

for (int i = 0; i < n; ++i)
    if (X[i] > Y[i])
        Z[i] = X[i];
    else
        Z[i] = Y[i];

би могао да се преведе у следећу секвенцу векторских инструкција:

...
LV V1, X        # Учитавамо део низа X у вектор V1
LV V2, Y        # Учитавамо део низа Y у вектор V2
SGTVS.D V1, V2  # Постављамо регистар маске на 1 на местима где важи X[i] > Y[i]
MOVVV.D V3, V1  # Постављамо елементе V3 на елементе V1 на местима где је маска 1
MVFM V1, VM     # Учитавамо маску у V1
NOTV V1         # Негирамо V1
MVTM V1, VM     # Учитавамо V1 у маску
MOVVV.D V3, V2  # Постављамо елементе V3 на елементе V2 на местима где је маска 1
SV V3, Z        # Уписујемо део низа Z
...

2. задатак

Поставка

[5п] Посматра се предвиђање скока коришћењем gshare предиктора. Описати рад овог предиктора. Упоредити рад овог предиктора и корелисаног предиктора који користи исти број бита одговарајућих улазних података.

Решење

gshare предиктор садржи следеће елементе:

  • Branch History Register (BHR) који функционише као shift регистар који чува глобалну историју скокова (да ли је услов испуњен или није),
  • Pattern History Table (PHT) која садржи аутомате стања који одређују крајња предвиђања, и
  • хеш функцију која комбинује BHR и битове адресе скока како би адресирала PHT.

За разлику од gshare, корелисани предиктор одвојено адресира једну од више PHT помоћу BHR, а затим један од аутомата у оквиру PHT помоћу адресе скока. Може се приметити да је корелисани предиктор, због свог већег броја PHT, за исте ширине улазних података доста скупљи од gshare. Такође се показало да је већина улаза у овакве PHT неискоришћено, па је gshare направљен како би побољшао ово искоришћење и смањио цену производње корелисаног предиктора.

3. задатак

Поставка

[10п] Разматра се рачунарски систем у коме се извршавање одређене инструкција одвија у 6 фаза помоћу измењеног процесора са стандардном проточном обрадом (слика 3.1.). У процесор са стандардом проточном обрадом је додата као други степен јединица PD (Instruction PreDecode) који[sic] обавља трансформацију инструкција задате архитектуре у инструкције RISC архитектуре. Сматрати да приступ меморији траје два сигнала такта. Архитектура процесора дефинише 16 регистра[sic] опште намене. Адресе и подаци су величине 16 бита.

Слика 4.1.[sic] — организација процесора
  1. Написати секвенцу инструкција (микроинструкција) циљне RISC архитектуре у коју се обавља пресликавање за део инструкцијског сета из табеле 3.1. изворишне CISC архитектуре. Уколико је потребно проширити број регистара опште намене у регистарском фајлу, онда треба за сваки додат регистар написати чему служи. Регистар R13 представља указивач на врх стека (SP) и показује на последњу слободну локацију. Стек расте према вишим адресама. Регистар R14 представља указивач на базну адресу стека (BP). Регистар R0 се користи као акумулатор, регистар R12 се користи као бројачки регистар и као такав има посебне инструкције које га користе. У табели 3.1. акције нису оптимизовано написане, већ описно.
  2. Нацртати формат инструкција циљне RISC архитектуре (на основу инструкција из табеле 3.1.).
Табела 3.1. — део инструкцијског сета процесора
Асемблерска инструкција Акција Микро инструкције
SWP Rx
MEM[Rx] ↔ ACC
DEC
ACC = ACC - 1
RTS
POP PC
LOOP disp
R12 = R12 - 1
IF R12 == 0 THEN
    PC = PC + disp
JMP adr
PC = adr
ADD (adr)
ACC = ACC + MEM[MEM[adr]]
LDB Rx
ACC = 0.Rx7..0
STRLEN adr
ACC = 0
WHILE MEM[adr] != 0 DO
    ACC = ACC + 1
    adr = adr + 1
END WHILE
VECADD adr
R1 = R1 + MEM[adr]
R2 = R2 + MEM[adr]
R3 = R3 + MEM[adr]
R4 = R4 + MEM[adr]
MUL R1
TMP = ACC
ACC = 0
FOR X = 0; X < R1; X++ DO
    ACC = ACC + TMP
END FOR

Решење

Претпоставља се да се под AX регистром у задатку мисли на акумулатор. Уводимо регистре:

  • R16: привремени регистар
  • R17: вредност 0
  • R18: још један привремени регистар
Решење трећег задатка.
Асемблерска инструкција Акција Микро инструкције Коментар
SWP Rx
MEM[Rx] ↔ ACC
LD R0, (Rx)0
ADDIS R16, R0, #0
ST R16, (Rx)0
Уколико би после ове секвенце микроинструкција дошла микроинструкција која користи меморију, то би био хазард по подацима.
DEC
ACC = ACC - 1
ADDIS R0, R0, #-1
RTS
POP PC
LD R16, (R13)-1
ADDI R13, R13, #-1
BEQZ R17, (R17+R16)
У последњој инструкцији се кроз горњи мултиплексер пропушта вредност R17 (0), која се користи и као услов скока, а кроз доњи вредност R16, која садржи жељену вредност PC, па стога и специфичан начин обележавања (који је еквивалентан са (R16)0).
LOOP disp
R12 = R12 - 1
IF R12 == 0 THEN
    PC = PC + disp
SUB R12, R12, #1
BEQZPI R12, (PC)disp
JMP adr
PC = adr
BEQZI R17, (R17)adr
ADD (adr)
ACC = ACC + MEM[MEM[adr]]
LD R16, (R17)adr
LD R16, (R16)0
ADDS R0, R0, R16
Дешава се хазард по подацима између прве и друге и између друге и треће микроинструкције.
LDB Rx
ACC = 0.Rx7..0
ANDIS R0, RX, #00FF
STRLEN adr
ACC = 0
WHILE MEM[adr] != 0 DO
    ACC = ACC + 1
    adr = adr + 1
END WHILE
ADDI R0, R17, #0
LD R16, (R0)adr
ADDI R0, R0, #1
BNEZPI R16, (PC)-3 * len(mInst)
ADDIS R0, R0, #-1
За ову ставку је речено на колоквијуму да може да се претпостави како PC броји микроинструкције уместо инструкције. Главне идеје су да се уклони хазард тиме што радимо ADD инструкцију испод LD, да се акумулатор користи уместо неког новог регистра за чување adr (јер се свакако увећава сваке итерације) и да након петље која обухвата другу, трећу и четврту микроинструкцију морамо смањити акумулатор за један, јер нам је претходна петља ефективно била do-while уместо while.
VECADD adr
R1 = R1 + MEM[adr]
R2 = R2 + MEM[adr]
R3 = R3 + MEM[adr]
R4 = R4 + MEM[adr]
LD R16, (R17)adr
ADDI R18, R17, #adr
LD R16, (R18)1
ADD R1, R1, R16
LD R16, (R18)2
ADD R2, R2, R16
LD R16, (R18)3
ADD R3, R3, R16
ADD R4, R4, R16
Разлог из ког ова секвенца микроинструкција може изгледати чудно јесте избегавање хазарда по подацима. Са учитавањем првог податка почиње се већ у првој микроинструкцији, али како у међувремену треба обавити чување adr у новом привременом регистру и започињање новог учитавања, она се не сабира са регистром R1 до четврте микроинструкције (када је та вредност и даље доступна у одговарајућем регистру). Након тога се логика понавља неколико пута: започели смо учитавање наредног податка, а док се тај податак учитава ми радимо сабирање претходно учитаног податка са одговарајућим регистром. Како је до девете микроинструкције завршено учитавање и последњег податка, можемо извршити последње сабирање.
MUL R1
TMP = ACC
ACC = 0
FOR X = 0; X < R1; X++ DO
    ACC = ACC + TMP
END FOR
ADDI R16, R0, #0
ADDIS R0, R17, #0
ADDI R18, R1, #0
ADDS R0, R0, R16
ADDI R18, R18, #-1
BNEZPI R18, (PC)-3 * len(mInst)
SUB R0, R0, R16
Идеја јесте да R16 користимо као претходну вредност акумулатора и R18 као бројач итерација који почиње од R1 и завршава се са 0. Уколико би нам провера за R18 == 0 била на врху, наша петља би се састојала из четири микроинструкције: провере, сабирања, декрементирања и безусловног скока. Уместо тога, проверу стављамо на дно па се наша петља састоји од три микроинструкције (резултујући у мањем укупном броју извршених микроинструкција), али због тога што смо опет ефективно направили do-while петљу ефекат последње итерације морамо да поништимо на крају. Као и за STRLEN, за ову ставку може да се претпостави како PC броји микроинструкције уместо инструкције. (На колоквијуму је накнадно речено да је податак у R1 означен, али то у овом решењу није узето у обзир јер такво коришћење и нема смисла.)

Користимо укупно седам RISC инструкција у овом сету:

  1. LD
  2. ST
  3. ADD
  4. SUB
  5. AND
  6. BEQZ
  7. BNEZ

Ово нам оставља следећи формат инструкције:

Формат инструкције у четвртом задатку
36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Код PIS флегови Одредишни регистар Изворишни регистар 1 Изворишни регистар 2 Непосредна вредност