Model de acces la memorie - Memory access pattern

În calcul , un model de acces la memorie sau un model de acces IO este modelul cu care un sistem sau un program citește și scrie memorie pe stocarea secundară . Aceste tipare diferă în ceea ce privește nivelul de localitate de referință și afectează drastic performanța cache- ului și au implicații și pentru abordarea paralelismului și distribuția volumului de lucru în sistemele de memorie partajate . Mai mult, problemele de coerență a cache-ului pot afecta performanța multiprocesorului , ceea ce înseamnă că anumite tipare de acces la memorie plasează un plafon paralelismului (pe care multe abordări core urmăresc să îl rupă).

Memoria computerului este de obicei descrisă ca " acces aleatoriu ", dar traversările de către software vor prezenta în continuare modele care pot fi exploatate pentru eficiență. Există diverse instrumente pentru a ajuta proiectanții de sistem și programatorii să înțeleagă, să analizeze și să îmbunătățească tiparul de acces la memorie, inclusiv VTune și Vectorization Advisor , inclusiv instrumente pentru a aborda tiparele de acces la memorie GPU

Modelele de acces la memorie au implicații și pentru securitate , ceea ce îi motivează pe unii să încerce și să mascheze activitatea unui program din motive de confidențialitate .

Exemple

Image
Modelele secvențiale și liniare sunt desenate incorect ca omologi între ei de unele publicații; în timp ce încărcăturile de muncă din lumea reală conțin modele aproape nenumărate

Secvențial

Cea mai simplă extremă este modelul de acces secvențial , în care datele sunt citite, procesate și scrise cu adresare directă incrementată / decrementată. Aceste modele de acces sunt extrem de predispuse la preluare .

Cu pași mari

Modele de acces 3D 2D cu pași strălucitoare sau simple (de exemplu, trecerea prin tablouri multidimensionale ) sunt la fel de ușor de prezis și se găsesc în implementările algoritmilor de algebră liniară și procesarea imaginilor . Placarea cu buclă este o abordare eficientă. Unele sisteme cu DMA au oferit un mod cu pași strânse pentru transferul de date între subtile de matrice 2D mai mari și memoria scratchpad .

Liniar

Un model de acces liniar este strâns legat de „strid”, unde o adresă de memorie poate fi calculată dintr-o combinație liniară a unui anumit index. Trecerea prin indici secvențial cu un model liniar oferă un acces strident . Un șablon de acces liniar pentru scrieri (cu orice șablon de acces pentru citirile care nu se suprapun) poate garanta că un algoritm poate fi paralelizat, care este exploatat în sistemele care susțin nucleele de calcul .

Cel mai apropiat vecin

Cele mai apropiate modele de acces la memorie din vecinătate apar în simulare și sunt legate de modele secvențiale sau în trepte. Un algoritm poate traversa o structură de date folosind informații de la cei mai apropiați vecini ai unui element de date (într-una sau mai multe dimensiuni) pentru a efectua un calcul. Acestea sunt frecvente în simulările de fizică care operează pe rețele. Cel mai apropiat vecin se poate referi și la comunicarea inter-nod într-un cluster; simulările fizice care se bazează pe astfel de modele de acces local pot fi paralelizate cu datele partiționate în noduri de cluster, cu o comunicare pur apropiată între ele, care poate avea avantaje pentru latență și lățime de bandă de comunicare. Acest caz de utilizare se potrivește bine cu topologia rețelei torus .

2D spațial coerent

În redarea 3D , modelele de acces pentru cartarea texturilor și rasterizarea primitivelor mici (cu distorsiuni arbitrare ale suprafețelor complexe) sunt departe de a fi liniare, dar pot prezenta în continuare spațialitate (de exemplu, în spațiul ecranului sau în spațiul texturii ). Acest lucru poate fi transformat într-o localitate de memorie bună printr-o combinație de ordine morton și placare pentru hărți de textură și date tampon cadru (maparea regiunilor spațiale pe liniile cache), sau prin sortarea primitivelor prin redarea diferită pe bază de țiglă . De asemenea, poate fi avantajos să stocați matricile în ordine morton în biblioteci de algebre liniare .

Împrăștia

Un model de acces de memorie scatter combină citirile secvențiale cu adresarea indexată / aleatorie pentru scrieri. În comparație cu colectarea, poate încărca mai puțin o ierarhie a cache-ului, deoarece un element de procesare poate expedia scrierile într-un mod „fire and uit” (ocolind cu totul cache-ul), în timp ce utilizează preluarea previzibilă (sau chiar DMA) pentru datele sursă.

Cu toate acestea, poate fi mai dificil să se paralelizeze, deoarece nu există nicio garanție că scrierile nu interacționează și multe sisteme sunt încă proiectate presupunând că o memorie cache hardware va uni mai multe scrieri mici în altele mai mari.

În trecut, cartografierea texturilor înainte a încercat să gestioneze aleatoria cu „scrie”, citind în mod secvențial informațiile sursei texturii.

PlayStation 2 consola utilizată mapare convențională textura inversă, dar manipulate orice scatter / gather procesare „on-chip“ folosind EDRAM, în timp ce modelul 3D (și o mulțime de date textură) din memoria principală a fost alimentată secvențial prin DMA. Acesta este motivul pentru care nu avea suport pentru primitive indexate și, uneori, trebuia să gestioneze texturile „în față” în lista de afișare .

Aduna

Într-un model de acces de memorie de colectare , citirile sunt adresate aleatoriu sau indexate, în timp ce scrierile sunt secvențiale (sau liniare). Un exemplu este găsit în maparea inversă a texturii , unde datele pot fi scrise liniar pe liniile de scanare , în timp ce adresele texturilor cu acces aleatoriu sunt calculate pe pixel .

Comparativ cu împrăștierea, dezavantajul este că stocarea în cache (și ocolirea latențelor) este acum esențială pentru citirile eficiente ale elementelor mici, cu toate acestea este mai ușor de paralelizat, deoarece scrierile sunt garantate să nu se suprapună. Ca atare, abordarea de colectare este mai frecventă pentru programarea gpgpu , unde threading-ul masiv (activat prin paralelism) este folosit pentru a ascunde latențele citite.

Se adună și se împrăștie combinate

Un algoritm poate aduna date dintr-o singură sursă, poate efectua unele calcule în memoria locală sau pe cip și poate împrăștia rezultatele în altă parte. Aceasta este în esență funcționarea completă a unei conducte GPU atunci când efectuați redare 3D - adunarea vârfurilor și texturilor indexate și împrăștierea pixelilor umbrite în spațiul ecranului . Rasterizarea primitivelor opace folosind un buffer de adâncime este „comutativă”, permițând reordonarea, care facilitează execuția paralelă. În cazul general, ar fi necesare primitive de sincronizare.

Aleatoriu

La extrema opusă este un model cu adevărat aleatoriu de acces la memorie. Câteva sisteme multiprocesor sunt specializate să se ocupe de acestea. Abordarea PGAS poate ajuta prin sortarea operațiunilor după date din mers (utilă atunci când problema * constă în localizarea datelor nesortate). Structurile de date care se bazează foarte mult pe urmărirea indicatorului pot produce deseori o localitate de referință slabă , deși sortarea uneori poate ajuta. Având în vedere un model cu adevărat aleatoriu de acces la memorie, poate fi posibil să îl descompunem (inclusiv etapele de împrăștiere sau strângere sau alte sortări intermediare) care pot îmbunătăți localitatea în general; aceasta este adesea o condiție prealabilă pentru paralelizare .

Abordari

Proiectare orientată spre date

Proiectarea orientată pe date este o abordare menită să maximizeze localitatea de referință, prin organizarea datelor în funcție de modul în care sunt parcurse în diferite etape ale unui program, în contrast cu abordarea mai obișnuită orientată obiect (de exemplu, organizarea astfel încât aspectul datelor reflectă în mod explicit model de acces).

Contrast cu localitatea de referință

Localitatea de referință se referă la o proprietate expusă de tiparele de acces la memorie. Un programator va schimba modelul de acces la memorie (prin refacerea algoritmilor) pentru a îmbunătăți localitatea de referință și / sau pentru a crește potențialul de paralelism. Un programator sau un proiectant de sistem poate crea cadre sau abstractizări (de exemplu, șabloane C ++ sau funcții de ordin superior ) care încapsulează un model specific de acces la memorie.

Diferite considerații pentru tiparele de acces la memorie apar în paralelism dincolo de localitatea de referință, și anume separarea citirilor și a scrisurilor. De exemplu: chiar dacă citirile și scrierile sunt „perfect” locale, poate fi imposibil de paralelizat din cauza dependențelor ; separarea citirilor și a scrierilor în zone separate produce un model de acces la memorie diferit, poate apare inițial mai rău în termeni de localitate pură, dar de dorit pentru a utiliza hardware-ul paralel modern.

Localitatea de referință se poate referi, de asemenea, la variabile individuale (de exemplu, capacitatea unui compilator de a le memora în cache în registre ), în timp ce termenul tipar de acces la memorie se referă doar la datele păstrate într-o memorie indexabilă (în special memoria principală ).

Vezi si

Referințe