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.
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.