Sunday, June 19, 2011

HW: Pamat s prokladanym cyklem

Pamat s prekladanym cyklom (interleaved memory) sa pouziva vo vykonnych pocitacoch (napriklad vektorove pocitace) k znizeniu cyklu pamate. Hlavna pamat je rozdelena do niekolkych blokov, ktore nazyvame banky. Banky pracuju samostatne a su schopne vykonavat citaci a zapisovaci cyklus nezavisle. Ak procesor komunikuje striedavo s roznymi pamatovymi blokmi, mozu prenosy prebiehat paralelne a komunikacia medzi pamatou a procesorom sa celkovo zrychli. 

Doba potrebna k realizacii jednej komunikacie medzi blokom a procesorom sa nazyva cyklus bloku. System je vyvazeny, ak je pamat rozdelena aspon do tolkych blokov, kolko je taktov cyklu. Znamena to, ze procesor moze v kazdom takte vykonat jeden pristup do pamate.Cyklus bloku trva vo vektorovych pocitacoch obvykle 4 - 8 taktov, takze staci, aby pamat bola rozdelena do 4 - 8 blokov. 

Pamat je obvykle delena tak, aby pri sekvencnom volani adries iducich tesne za sebou boly vyuzivane postupne vsetky bloky pamate. Pri sekvencnom spracovani jednotlivych zloziek vektoru tak procesor moze zpracovat jednu zlozku za jeden takt.  

Suma sumarum, pamat s prekl. cyklami pouizvame s vyhodou pre urychlenie pristupov. Sucasne sa tak cita z n pamatovych bank a rychlost citania je teda n-nasobna. Rychlost citania je ovplyvnena stridou. Strida (stride) je vzdialenost susediacich elementov jedneho z vektorov zapisanych v pamati vektoru. 

Operacie s Interleaved Memory
Skupiny dat medzi registrami a pamatou presuvaju operacie Load/Store. Celkovo rozlisujeme 3 typ adresacii IM: 
  • unit stride - jednotkovy krok, najrychlejsi 
  • non-unit stride - konstantny krok 
  • indexed alebo gather&scatter je vhodny pre riedke rozlozenie dat 


Prvou z operacii je vektor stride. Na obrazku nasobenie vektoru, co je vlastne scitanie prvkov vektora. Vsimnite si rozdielnu stride a nasledne usporiadanie prvkov. Ono to vlastne je konstantny krok, takze mi nejde do hlavy ta rozdielna terminologia. Mozno sa jedna o ten vysledok, ktory ma s=1. 

V pripade unit stride sa jedna o jednotkovy skok. Prvok vektoru v[0] = M[x], v[1] = M[x+1], v[n-1] = M[x + n-1] atd. 






Non-unit stride je konstantny krok. To znamena, ze prvky su od seba vzdialene na konstantnu vzdialenost.Prvok v[0] = M[x], v[1] = M[x + s], a posledny prvok bude v[n-1] = M[(x + n -1) * s].   




Dalsimi technikmi pre manipulaciu s vektormi su gather a scatter, co je vlastna sada dvoch prikazov, ktore sluzia pre manipulaciu s riedkymi vektormi. 

Gather ma na starosti zber dat z relativnych adries vektoru v2, ktore nahraje do registru v1. Prvky su bazovane k registru r1 (skalar). Vektor relativnych adries sa da dostat napriklad ako v1[i] = M[r1 + v2[i]]. Instrukcia Gather pre tento priklad je lvi v1, r1, v2. 

Scatter je presnym opakom gather a sluzi k rozptyleniu dat. Teda, v pripade prikladu gather vyssie by sa jednalo o rozptylenie dat vektoru v1 na adresy specifikovane elementmi vektora v2. Teda, M[r1+v2[i]] = v1[i]. Instrukcia svi r1, v2, v1. 

Majme IM rozdelenu do 8 bank s vybavovacou dobou 4 takty a opzdenim na prepinaci 1 takt. Skusme nacitat 16 poloziek pomocou vektorovych operacii. Instruction Fetch a Instruction Decode nas nezaujima. Pre kazde citanie z pamate potrebujem 4 takty + 1 takt opozdenia a teda 5 taktov. Pre Write Back potrebujem jeden takt. Mam osem baniek a potrebujem nacitat 16 poloziek a predpokladam, ze z kazdej banky to budu 2 polozky. Pre 1 banku potrebujem 6 taktov, pre 1 a 2 druhu 7, pre 1 a 2 a 3 potrebujem 8 a pre 16 potrebujem (n - 1)+6 = 21 taktov. Pri 8-ich bankach nedojde k stallu v tomto priklade. Na obrazku je spocitany cas, ktory cela sranda bude trvat.