Hazardi podataka

Hazard podataka se javlja kod procesora sa pipeline organizacijom zbog izmenjenog redosleda pristupa podacima u odnosu na redosled pristupa podacima kod procesora bez pipeline organizacije. Ovo je posledica činjenice da se kod pipeline procesora preklapa izvršavanje različitih faza više instrukcija. Kod procesora koji nemaju pipeline organizaciju instrukcije se izvršavaju sekvencijalno, pa se tek po izvršavanju svih faza jedne instrukcije kreće sa izvršavanjem faze prve sledeće. Kao ilustracija hazarda podataka koji može da nastane kod pipeline izvršavanja instrukcija može se uzeti sledeći primer:

add R1, R2, R3

sub R4, R5, R1

and R6, R1, R7

or R8, R1, R9

xor R10, R1, R11

Sve instrukcije posle instrukcije add koriste rezultat instrukcije add koji se nalazi u registru R1. Situacija u stepenima pipeline-a prilikom izvršavanja pet instrukcija prikazana je na slikama III-1 i 3-9. Vidi se da instrukcija add upisuje podatak u R1 u stepenu WB, dok instrukcija sub čita podatak u stepenu ID. Instrukcija add završava upis tek posle tri periode signala takta u odnosu na trenutak kad instrukcija sub počinje čitanje. Ovakva situacija se naziva hazard podataka. Ukoliko se nešto ne preduzme da se ovakva situacija izbegne, instrukcija sub će očitati pogrešnu vrednost i koristiće je. Ova vrednost čak i ne mora da bude uvek postavljena od iste instrukcije. Nekada to može da bude neka od instrukcija pre instrukcije add. Ukoliko, pak, stigne prekid između instrukcija add i sub, a obrada prekida je tako realizovana da se skače na prekidnu rutinu po kompletiranju instrukcije add, u R1 će biti vrednost koju je postavila instrukcija add.

 

1

2

3

4

5

6

7

8

9

add R1, R2, R3

IF

ID

EX

MEM

WB*

       

sub R4, R5, R1

 

IF

ID**

EX

MEM

WB

     

and R6, R1, R7

   

IF

ID**

EX

MEM

WB

   

or R8, R1, R9

     

IF

ID**

EX

MEM

WB

 

xor R10, R1, R11

       

IF

ID***

EX

MEM

WB

Legenda:

*—add upisuje u R1

**—sub, and, or čitaju pogrešnu vrednost iz R1

***—xor čita korektnu vrednost iz R1

Slika III-1 Situacija u pipeline-u sa prisutnim hazardom podataka

Slika 3.9 Korišćenje rezultata instrukcije ADD od strane naredne tri instrukcije izaziva hazard, pošto u trenutku čitanja ta vrednost nije upisana u registar

Instrukcija and je takođe pogođena hazardom podataka. Sa slike III-1 se vidi da instrukcija add tek na kraju perioda 5 signala takta kompletira upis u registar R1. Zbog toga instrukcija and koja čita registar R1 u periodi 4 signala takta dobija pogrešnu vrednost.

Slična je situacija i sa instrukcijom or. Ova instrukcija čita registar R1 za vreme periode 5 signala takta. S obzirom da instrukcija add tek na kraju periode 5 signala takta kompletira upis u registar R1, i instrukcija or dobija pogrešnu vrednost registra R1.

Tek instrukcija xor dobija korektnu vrednost registra R1, jer instrukcija add u toku periode 5 signala takta upisuje u registar R1, a instrukcija xor ga čita u periodi 6 signala takta.

Ovo je samo jedna i to dosta česta vrsta hazarda podataka. Hazarda podataka ima više i oni se mogu svrstati u tri grupe u zavisnosti od toga po kom redosledu bi trebalo čitati i upisivati od strane instrukcija u pipeline-u da bi se sačuvalo regularno izvršavanje programa. Posmatraće se dve instrukcije i i j, pri čemu se instrukcija i javlja pre instrukcije j. Mogući hazardi podataka su:

  1. RAW (read after write)—instrukcija j pokušava da čita podatak pre nego što instrukcija i upiše, tako da instrukcija j dobija nekorektno staru vrednost. Ovo je najčešći tip hazarda podataka koji je do sada i jedino razmotren.
  2. WAR (write after read)—instrukcija j pokušava da upiše pre nego što instrukcija i čita, pa instrukcija i nekorektno dobija novu vrednost. U posmatranom pipeline-u ovo ne može da se desi zato što se čitanje obavlja u jednom od početnih stepeni pipeline-a i to stepenu ID, a upis u jednom od poslednjih stepeni pipeline-a i to stepenu WB.
  3. WAW (write after write)—instrukcija j pokušava da upiše neki podatak pre nego što je on najpre upisan instrukcijom i. Ovde se upisivanje izvršava po pogrešnom redosledu pa u operandu ostaje vrednost upisana instrukcijom i umesto instrukcijom j. Ovaj hazard postoji u pipeline-ovima u kojima se može upisivati iz više stepeni, što nije slučaj u posmatranom pipeline-u u kome se može upisivati samo iz stepena WB.

Treba zapaziti da slučaj RAR (read after read) nije hazard.

Zbog toga što se RAW hazard najčešće javlja, a jedino je prisutan hazard podataka u usvojenoj pipeline organizaciji procesora, dalja razmatranja će biti usmerena na tehnike kojima se obezbeđuje korektno izvršavanje instrukcija u pipeline-u sa prisutnim RAW hazardom podataka.

Korektno izvršavanje instrukcija zaustavljanjem pipeline-a

Najjednostavniji način da se hazard podataka prisutan u primeru sa slike III-1 reši je zaustavljanje instrukcije sub u pipeline-u za tri periode signala takta, da bi se instrukcija add normalno izvršavala (slika III-2). Time bi se instrukciji sub omogućilo da pređe u stepen ID u kome čita podatak iz registra R1 tek pošto instrukcija add završi fazu WB u kojoj upisuje podatak u registar R1. Instrukcije and, or i xor bi, takođe, čitale korektnu vrednost registra R1 pri prolasku kroz stepen ID pipeline-a.

 

1

2

3

4

5

6

7

8

9

10

11

12

add R1, R2, R3

IF

ID

EX

MEM

WB

             

sub R4, R5, R1

 

IF

stall

stall

stall

ID

EX

MEM

WB

     

and R6, R1, R7

         

IF

ID

EX

MEM

WB

   

or R8, R1, R9

           

IF

ID

EX

MEM

WB

 

xor R10,R1, R11

             

IF

ID

EX

MEM

WB

Slika III-2 Situacija u pipeline-u kao posledica hazarda podataka

Korektno izvršavanje instrukcija bez zaustavljanjem pipeline-a prosleđivanjem

Hazard tipa RAW se može hardverski eliminisati tehnikom prosleđivanja (forwarding, bypassing, short-circuiting). Rezultat sa izlaza jedinice ALU stepena EX se zajedno sa još nekim informacijama iz pipeline registra ID/EX stepena EX na signal takta šalje u pipeline registar EX/MEM stepena MEM (slike III-3 i 3-10). Izlaz registra EX/MEM.ALUOUT se vodi ne samo na ulaze pipeline registra MEM/WB.ALUOUT stepena WB već se preko multipleksera MX1 i MX2 vodi i na ulaze ALU. Ukoliko hardver za prosleđivanje otkrije da instrukcija koja je trenutno u stepenu MEM treba da svoj rezultat upiše u registar koji je izvorišni za instrukciju koja se nalazi u stepenu EX, on selektuje kao operand za ALU ne vrednost očitanu iz registarskog fajla Registers i koja se nalazi u registru ID/EX.A već vrednost prosleđenu od prethodne instrukcije preko registra EX/MEM.ALUOUT.

Međutim, situacija se usložnjava u slučajevima sličnim onim iz programa sa slike III-1 u kome instrukcija add postavlja registar R1, a sledeće četiri instrukcije sub, and, or i xor ga koriste. Tada rezultat instrukcije add treba proslediti ne samo prvoj instrukciji iza nje (sub), već i drugoj (and) i trećoj (or). Tek četvrta instrukcija (xor) može da čita korektnu vrednost registra R1. Sa slike III-4 se vidi situacija u pipeline-u tokom izvršavanja posmatranih instrukcija. Dok je instrukcija add u stepenu EX instrukcija sub koja je prva iza nje bi trebalo da u stepenu ID očita registar R1. Dok je instrukcija add u stepenu MEM instrukcija and, koja je druga iza nje, bi trebalo u stepenu ID da očita registar R1. Dok instrukcija add u stepenu WB upisuje u registar R1, instrukcija or koja je treća iza nje bi trebalo u stepenu ID da očita registar R1. Zbog toga treba preko multipleksera MX1 i MX2 (slika III-3) na ulaze jedinice ALU prosleđivati i izlaze registara EX/MEM.ALUOUT, MEM/WB.ALUOUT i RTMP.ALUOUT. Instrukcija koja se nalazi u stepenu EX će, ako joj to treba, iz registra EX/MEM.ALUOUT stepena MEM učitati rezultat prve instrukcije ispred sebe, iz registra MEM/WB.ALUOUT stepena WB učitati rezultat druge instrukcije ispred sebe i iz registra RTMP.ALUOUT izlaznog registra RTMP rezultat treće instrukcije ispred sebe. Tek kada instrukcija xor dođe u stepen ID u registru R1 će se nalaziti rezultat instrukcije add, pa će ga tek ova instrukcija uzimati iz registarskog fajla Registers. Stoga instrukcija koja se nalazi u stepenu EX treba da proverava da li je neko od njenih izvorišta odredište za vrednosti iz registara EX/MEM.ALUOUT, MEM/WB.ALUOUT i RTMP.ALUOUT koje su nastale izvršavanjem prve, druge i treće instrukcije ispred nje, respektivno. Ako je to slučaj, onda hardver za prosleđivanje kao operand koristi EX/MEM.ALUOUT, MEM/WB.ALUOUT i RTMP.ALUOUT, a ne vrednost očitanu iz registarskog fajla koja se nalazi u registru ID/EX.A. Ovo važi za oba izvorišna operanda instrukcije koja se nalazi u stepenu EX.

Hardver za prosleđivanje pored registara EX/MEM.ALUOUT, MEM/WB.ALUOUT i RTMP.ALUOUT, ima i registre EX/MEM.rd, MEM/WB.rd i RTMP.rd za čuvanje adresa registara registarskog fajla Registers u koje treba upisati EX/MEM.ALUOUT, MEM/WB.ALUOUT i RTMP.ALUOUT, registre ID/EX.rs1 i ID/EX.rs2 za čuvanje adresa izvorišnih registara čiji se sadržaji koriste u instrukciji koja je u stepenu EX, tri para komparatora za upoređivanje ID/EX.rs1 i ID/EX.rs2 sa EX/MEM.rd, MEM/WB.rd i RTMP.rd i multipleksere MX1 i MX2 sa odgovarajućom upravljačkom logikom.

Radi smanjivanja složenosti hardvera procesora poželjno je smanjiti broj instrukcija koje se na ovakav način prosleđuju. Taj broj bi se mogao smanjiti sa tri na dva ukoliko bi se u toku trajanja jedne periode signala takta realizovao i upis i čitanje iz registar fajla Registers. Uzeće se da se u prvoj polovini faze WB upisuje u registarski fajl Registers, a u drugoj polovini faze ID čita iz registarskog fajla Registers. Uz ovakvu realizaciju upisivanja i čitanja registarskog fajla Registers situacija u pipeline-u za program sa slike III-4 se može predstaviti kao na slici III-5. Instrukcije sub i and još uvek zahtevaju da im se rezultat instrukcije add, koji će se upisati u registar R1, prosledi u stepen EX. Međutim, u ovom slučaju, za razliku od malopre, to nije potrebno uraditi i za instrukciju or koja je treća iza instrukcije add. Instrukcija add, koja se nalazi u stepenu WB, će u prvoj polovini periode signala takta upisati svoj rezultat u registar R1, dok će instrukcija or, koja se nalazi u stepenu ID, u drugoj polovini te iste periode signala takta, očitati sadrđaj registra R1. Za ovakvu realizaciju treba sa slike III-3 izbaciti registre RTMP.ALUOUT i RTMP.rd i par komparatora. U svim daljim razmatranjima će se podrazumevati da se upis i čitanje iz registarskog fajla Registers realizuju u dve polovine signala takta i da se instrukciji u stepenu EX prosleđuju rezultati instrukcija koje se nalaze u stepenima MEM i WB.

Slika III-3 Hardver za prosleđivanje rezultata tri instrukcije

Slika 3.10 Instrukcije koje zavise od rezultata instrukcije ADD koriste prosleđivanje podataka da bi izbegla hazard

 

Slika III-4. Situacija u pipeline-u pri korišćenju hardvera za prosleđivanje rezultata jedinice ALU iz registara EX/MEM.ALUOUT (sub), MEM/WB.ALUOUT (and) i RTMP.ALUOUT (or) na ulaz jedinice ALU za tri instrukcije

 

Slika III-5. Situacija u pipeline-u pri korišćenju hardvera za prosleđivanje rezultata jedinice ALU iz registara EX/MEM.ALUOUT (sub) i MEM/WB.ALUOUT (and) na ulaz jedinice ALU za dve instrukcije

Ovo je bio samo jedan od više mogućih slučajeva prosleđivanja. Ovde je prosleđivan rezultat jedinice ALU na ulaz iste jedinice. Prosleđivanje se može generalizovati i na slučajeve kada druge jedinice procesora svoj rezultat prosleđuju na svoj ulaz kao i na slučajeve kada se prosleđuje rezultat jedne jedinice na ulaz druge jedinice.

Situacija kada jedinica Data memory treba da prosledi rezultat sa svog izlaza na svoj ulaz se može ilustrovati sledećom sekvencom instrukcija:

add R1, R2, R3

lw R4, 0(R1)

sw 12(R1), R4

Ovde bi bez prosleđivanja, a da bi se izbegao RAW hazard podataka, moglo da dođe do zaustavljanja pipeline-a iz dva razloga. Prvi je da je rezultat ALU jedinice iz stepena EX, koji nastaje kao rezultat izvršavanja instrukcije add i koji treba da se upiše u registar R1, potreban istoj toj jedinici u instrukcijama lw i sw koje slede za njom. Drugi je da je rezultat jedinice Data Memory iz stepena MEM, koji nastaje kao rezultat izvršavanja instrukcije lw i koji treba da se upiše u registar R4, potreban istoj toj jedinici u instrukciji sw koja sledi za njom radi upisa u Data memory. Na slikama III-6 i 3-11 su prikazana potrebna prosleđivanja da bi se radi eliminisanja RAW hazarda podataka izbeglo zaustavljanje pipeline-a. Ovde je potrebno na ulaze jedinice ALU zbog instrukcija lw i sw i registra R1 vraćati sadržaje registara EX/MEM.ALUOUT i MEM/WB.ALUOUT, respektivno, a na ulaz jedinice Data Memory zbog instrukcije sw i registra R4 vraćati sadržaj registra MEM/WB.LMD i koristiti umesto EX/MEM.B.

Slika III-6. Situacija u pipeline-u pri korišćenju hardvera za prosleđivanje rezultata jedinice Data memory iz registara MEM/WB.LMD (sw) na ulaz jedinice Data memory

Slika 3.11 Prikazano je prosleđivanje operanda koji je potreban radi pamćenja tokom ciklusa MEM

Slučaj kada treba proslediti izlaz jedne jedinice na ulaz druge jedinice da bi se radi eliminisanja RAW hazarda podataka izbeglo zaustavljanje pipeline-a može se ilustrovati sledećom sekvencom instrukcija:

add R1, R2, R3

sw 0(R4), R1

Na slici III-7 su prikazana potrebna prosleđivanja da bi se radi eliminisanja RAW hazarda podataka izbeglo zaustavljanje pipeline-a. U ovom slučaju je instrukciji sw za jedinicu Data memory u stepenu MEM potreban rezultat instrukcije add iz jedinice ALU stepena EX. Zbog toga na ulaze jedinice Data Memory stepena MEM treba voditi sadržaj registra MEM/WB.ALUOUT i koristiti za upis umesto sadržaja registra EX/MEM.B na adresi određenoj sadržajem registra EX/MEM.ALUOUT.

Slika III-7. Situacija u pipeline-u pri korišćenju hardvera za prosleđivanje rezultata jedinice ALU iz registra MEM/WB.ALUOUT (sw) na ulaze jedinice Data memory

Da bi se u razmatranom procesoru pipeline organizacije pri prisutnom RAW hazardu podataka izbeglo zaustavljanje pipeline-a a sam hazard eliminisao, treba obezbediti prosleđivanje ne samo na ulaze jedinica ALU i Data Memory, već i na ulaz jedinice Zero?, koja se nalazi u stepenu EX. Na njen ulaz treba prosleđivati izlaze jedinica ALU i Data Memory. U slučaju branch instrukcija u jedinici Zero? se vrši provera sadržaja registra ID/EX.A ili na vrednost nula ili na vrednost različito od nule i postavlja jednorazredni registar EX/ME.cond. Slučajevi kada treba proslediti rezultat jedinice ALU na ulaz jedinice Zero? dati su na slikama III-8 i III-9. U slučaju primera sa ovih slika na ulaz jedinice Zero? treba proslediti sadržaje registara EX/MEM.ALUOUT i MEM/WB.ALUOUT, respektivno, i koristiti umesto sadržaja registra ID/EX.A.

Slika III-8. Situacija u pipeline-u pri korišćenju hardvera za prosleđivanje rezultata jedinice ALU iz registra EX/MEM.ALUOUT (beqz) na ulaz jedinice Zero?

Slika III-9. Situacija u pipeline-u pri korišćenju hardvera za prosleđivanje rezultata jedinice ALU iz registra MEM/WB.ALUOUT (bneq) na ulaz jedinice Zero?

Slučaj kada, radi eliminisanja RAW hazarda bez zaustavljanja pipeline-a, treba proslediti rezultat jedinice Data Memory iz stepena MEM na ulaz jedinice Zero? stepena EX, dat je na slici III-10. U ovom slučaju na ulaz Zero? treba proslediti sadržaj registra MEM/WB.LMD i koristiti umesto sadržaja registra ID/EX.A.

Slika III-10. Situacija u pipeline-u pri korišćenju hardvera za prosleđivanje rezultata jedinice Data memory iz registra MEM/WB.LMD (beqz) na ulaz jedinice Zero?

Hazard podataka se javlja kada nekom podatku pristupaju dve instrukcije koje su dovoljno blizu da se preklapanjem njihovog izvršavanja zbog pipeline-a menja redosled pristupa tom podatku od strane te dve instrukcije. Do sada razmotreni hazardi podataka se odnose na pristup registrima. Međutim, hazardi podataka postoje i kod pristupa memorijskim lokacijama. U razmatranom procesoru pipeline organizacije oni ne mogu da se jave jer pipeline organizacija ne menja redosled pristupa memorijskim lokacijama u odnosu na onaj koji bi bio za slučaj procesora sa sekvencijalnim izvršavanjem instrukcija.

Napomena: Pogledati sledeće sekvence:

add R1, R2, R3

sub R5, R6, R7

sw 0(R8), R1

i

lw R1, 0(R2)

sw 0(R5), R6

sw 0(R8), R1

Zaustavljanje pipeline-a kao jedini način obezbeđivanja korektnog izvršavanja instrukcija (pipeline stall, pipeline interlocks)

Postoje neke situacije RAW hazarda podataka kada je jedini način da se obezbedi korektno izvršavanje instrukcija u pipeline-u zaustavljanje pipeline-a. Posmatra se sledeća sekvenca instrukcija:

lw R1, 32(R6)

add R4, R1, R7

sub R5, R1, R8

and R6, R1, R7

Vrednost koja se čita iz memorije instrukcijom lw i upisuje u registar R1 koristi se u sve tri instrukcije iza instrukcije lw. Situacija u stepenima pipeline-a za slučaj ovog programa bez zaustavljanja pipeline-a prikazana je na slikama III-11 i 3-12.

lw

R1, 32(R6)

IF

ID

EX

MEM

WB

add

R4, R1, R7

 

IF

ID

EX

MEM

sub

R5, R1, R8

   

IF

ID

EX

and

R6, R1, R7

     

IF

ID

Slika III-11 Situacija u pipeline-u sa prisutnim hazardom podataka pri čitanju iz memorije

Slika 3.12 Instrukcija LOAD može da prosledi svoj rezultat instrukcijama AND i OR, ali ne i instrukciji SUB, pošto bi to značilo prosleđivanje rezultata u "negativnom vremenu"

Instrukcija lw ima podatak u registru MEM/WB.LMD tek na kraju svoje faze MEM. Ova faza se izvršava u istoj periodi signala takta kao i faza EX instrukcije add. Međutim, instrukciji add je podatak od instrukcije lw potreban na početku faze EX. Vidi se da ne postoji način da on stigne za instrukciju add makar se koristila tehnika prosleđivanja sadržaja registra MEM/WB.LMD na ulaze jedinice ALU. Tek za instrukciju sub podatak od instrukcije lw se može iz registra MEM/WB.LMD proslediti na ulaz jedinice ALU. Instrukcija and ga dobija preko registarskog fajla Registers, jer ga instrukcija lw upisuje u registar R1 u prvoj polovini faze WB, a instrukcija and čita u drugoj polovini faze ID.

Jedini način da se obezbedi korektno izvršavanje programa je zaustavljanje pipeline-a (pipeline interlock, pipeline stall). Izgled pipeline-a pri zaustavljanju pipeline-a je dat na slikama III-12 i 3-13. Sve instrukcije počev od instrukcije add su zakašnjene za jednu periodu signala takta. Sada se rezultat instrukcije lw iz registra MEM/WB.LMD stepena WB direktno prosleđuje instrukciji add na ulazu jedinice ALU u stepenu EX. Instrukcija lw u prvoj polovini stepena WB upisuje u R1, a instrukcija sub čita u drugoj polovini stepena ID.

Slika III-12. Zaustavljanje pipelinei-a radi izbegavanja hazarda podataka pri čitanju vrednosti iz memorije koja je potrebna jedinici ALU

Slika 3.13 Konflikt oko učitavanja operanda izaziva zastoj u taktu 4, i na taj način zakašnjava instrukciju SUB i one koje je slede za jedan ciklus

Slična situacija se javlja i u sekvenci instrukcija sa slike III-13. Na ulaze jedinice Zero? treba proslediti sadržaj registra MEM/WB.LMD iz stepena WB, ali tek pošto se instrukcija beqz zaustavi u pipeline-u za jednu periodu signala takta i time sačeka da se operacija čitanja iz jedinice Data Memory u stepenu MEM kompletira.

Slika III-13. Zaustavljanje pipeline-a radi izbegavanja hazarda podataka pri čitanju vrednosti iz memorije koja je potrebna jedinici Zero?

Slika 3.20 Prosleđivanje rezultata ALU jedinici zahteva dodavanje tri ulaza kod svakog ALU multipleksera i dodavanje tri toka podataka do novih ulaza

Zakašnjeno punjenje (delayed load)

Ima više situacija kada je jedini način da se eliminiše RAW hazard podataka zaustavljanje pipeline-a. Jedan od tipičnih primera za to je izvršavanje instrukcija generisanih na uobičajeni način za izraz A =  B +  C. Ovde se zahteva zaustavljanje pipeline-a zbog druge instrukcije lw, koja sadržaj C puni u registar R2 (slika III-14). Iako je obezbeđeno prosleđivanje rezultata izvršavanja druge instrukcije lw iz registra MEM/WB.LMD stepena WB na ulaz jedinice ALU stepena EX, instrukcije add i sw se moraju zaustaviti za jednu periodu signala takta u pipeline-u. Instrukcija sw ne treba da se zaustavlja, jer se vrednost koju instrukcija add treba da upiše u registar R3, a koja je potrebna za instrukciju sw, prosleđuje iz registra MEM/WB.ALUOUT stepena WB na ulaz jedinice Data memory stepena MEM gde se koristi za upis u jedinicu Data Memory umesto sadržaja registra EX/MEM.B.

Slika 16 Tipičan izgled pipeline-a pri izračunavanju izraza A =  B +  C

Jedan od načina da se ova vrsta hazarda podataka izbegne bez zaustavljanja pipeline-a je da prevodilac preuredi generisane instrukcije na takav način da se izbegne da iza instrukcije lw bude odmah instrukcija koja kao izvorište ima registar koji je odredište za instrukciju lw. Jedna ovako generisana sekvenca instrukcija za sračunavanje izraza

A =  B +  C;

D =  E +  F;

je:

Dve moguće situacije zaustavljanja pipeline-a zbog instrukcije lw i to:

lw Rc, c i add Ra, Rb, Rc i

lw Rf, f i add Rd, Re, Rf

su izbegnute. U prvom slučaju je između instrukcija lw Rcc i add RaRbRc ubačena instrukcija lw Ree iz drugog izraza, a u drugom slučaju je između instrukcija lw Rff i add RdReRf ubačena instrukcija sw aRa iz prvog izraza. Pretpostavlja se da se rezultati stepena MEM za instrukcije lw Rcc i lw Rff prosleđuju na ulaze stepena EX za instrukcije add RaRbRc i add RdReRf, respektivno, kao i da se rezultat stepena EX za instrukciju add RdReRf prosleđuje u stepen MEM za instrukciju sw dRd i da zbog toga nema zaustavljanja pipeline-a.

Mehanizam kojim se, softverskim putem izbegavanjem stavljanja iza instrukcije lw koja koristi kao izvorišni registar odredišni registar instrukcije lw, sprečava zaustavljanje pipeline-a pri izvršavanju instrukcije lw se naziva zakašnjeno punjenje (delayed load). Ova tehnika je sasvim dobra, tako da neki procesori umesto hardverski softverski se štite od ovog hazarda podataka. Ako ne može da se nađe ni jedna druga instrukcija, onda se kod takvih procesora radi sprečavanja ovog hazarda podataka stavlja instrukcija nop.