Skoči na vsebino

Pomnilniška hierarhija1

GPE vsebujejo različne pomnilnike, do katerih dostopajo posamezni procesni elementi oziroma posamezne niti. Spodnja slika prikazuje pomnilniško hierarhijo na GPE.

Pomnilniška hierarhija

Vsak nivo hierarhije ima različen čas dostopa, ki je zapisan v spodnji tabeli (čas dostopa je merjen v urinih ciklih).

Pomnilnik Čas dostopa
Registri 1
Lokalni pomnilnik ~5
Pomnilnik tekstur ~500
Pomnilnik konstant ~500
Globalni pomnilnik ~500

Registri

Vsaka računska enota (CU) vsebuje nekaj tisoč registrov, ki se enakomerno razdelijo posameznim nitim. Registri so privatni za vsako nit. Računska enota v Tesla K40 ima 65536 registrov in vsaka nit lahko uporablja največ 255 registrov. Niti v registrih hranijo operande, do katerih najbolj pogosto dostopajo. Vzemimo, da imamo 120 delovnih skupin s po 128 nitmi. Na Tesla K40 s 15 računskimi enotami bomo imeli po osem delovnih skupin na računsko enoto (120/15=8), pri čemer bo vsaka niti dobila do 64 registrov (65536/(8*128)=64).

Lokalni pomnilnik

Vsaka računska enota ima majhen in hiter pomnilnik SRAM (statični RAM), ki se običajno med zaganjanjem programov avtomatično razdeli na dva dela:

  • prvo-nivojski predpomnilnik (L1) in
  • lokalni pomnilnik, ki ga lahko uporabljajo niti na eni računski enoti.

Pri pospeševalniku Tesla K40 je ta pomnilnik velik 64kB in se ga lahko deli na tri različne načine:

  • 16 kB L1 in 48kB lokalni pomnilnik,
  • 32 kB L1 in 32kB lokalni pomnilnik,
  • 48 kB L1 in 16kB lokalni pomnilnik.

Lokalni pomnilnik se praviloma uporablja za komunikacijo med nitmi znotraj iste računske enote (niti si s pomočjo lokalnega pomnilnik izmenjujejo podatke).

Globalni pomnilnik

To je največji pomnilniški porstor na GPE in je skupen vsem nitim in vsem računskim enotam. Pri Tesla K40 je implemantiran v GDDR5. Kot vsi dinamični pomnilniki, ima zelo velik dostopni čas (nekaj 100 urinih period). Dostop do glavnega pomnilnika na GPE se vedno izvaja v večjih blokih ali segmentih - pri Tesla K40 je to 128 bajtov. Zakaj dostop po segmentih? Zato ker GPE sili niti v item snopu da sočasno dostopajo do podatkov v globalnem pomnilniku. Tak dostop nas sili v podatkovno vzporedno programiranje in ima pomembno posledico. Če niti v snopu dostopajo do sosednjih 8-, 16-, 24- ali 32-bitnih podatkov v globalnem pomnilniku, potem se ti podatki nitim dostavijo v eni sami pomnilniški transakciji, saj tvorijo en segment. Če pa do nekega podatka v globalnem pomnilniku dostopa le ena nit iz snopa (na primer zaradi vejitev), je dostop izveden do celotnega segmenta, a se nepotrebni podatki zavržejo. Če pa dve niti iz istega snopa dostopata do podatkov, ki sodijo v dva različna segmenta, potem sta potrebna dva pomnilniška dostopa. Zelo pomembno je, da že pri nitenju naših programov zagotavljamo združevanje pomnilniških dostopov v segmente (ang. memory coalescing) - trudimo se, da vse niti v snopu dostopajo do zaporednih podatkov v pomnilniku.

Pomnilnika konstant in tekstur

Pomnilnika konstant in tekstur sta le ločeni področji v globalnem pomnilniku, v katerih hranimo konstantne podatke, vendar imata dodatne lasnosti, ki omogočajo lažji dostop do podatkov v teh dveh področjih: - konstantni podatki v pomnilniku konstant se vedno predpomnijo, ta pomnilnik omogoča pošiljanje enega samega podatka vsem nitim v snopu naenkrat (ang. broadcasting), - konstantni podatki (pravzaprav slike) v pomnilniku tekstur se vedno predpomnijo v predpomnilniku, ki je optimiziran za 2D dostope; na ta način se pohitrijo dostopi do tekstur in konstantnih slik v globalnem pomnilniku.




  1. © Patricio Bulić, Univerza v Ljubljani, Fakulteta za računalništvo in informatiko. Gradivo je objavljeno pod licenco Creative Commons Priznanje avtorstva-Nekomercialno-Deljenje pod enakimi pogoji 4.0 Mednarodna