Локалност референци — разлика између измена

Садржај обрисан Садржај додат
Ред 37:
 
== Општа употреба локаности ==
 
Ако се већину времена значајан део укупних референци скупља у кластере, и ако се облик овог система кластера може добро предвидети, онда се може користити за оптимизацију брзине. Постоји неколико начина да се добију бенефиције од кластера. Уобичајене технике за оптимизацију су:
 
;Повећање локалности референци
 
Ово се обично постиже софтверски.
 
;Искоришћавање локалности референце
 
Ово се обично постиже хардверски. Временски и просторни локалитети се могу капитализовати по хијерархијским хардверским складиштима. Локалност једнаког одстојања може се користити на одговарајући начин од стране специјализованих инструкција процесора, ова могућност није само одговорност хардвера,него и софтвера такође, било да је њена структура погодна ѕа израду бинарног програма који узима специјализоване инструкције у обзир. Локалитет гране је сложенија могућност, стога је потребно више напора око развоја, али постоји много већа резерва за будуће истраживање у овој врсти локалитета, него у било којој од преосталих.
 
== Коришћење просторног и временског локалитета ==
 
=== Хијерархијска меморија ===
 
Хијерархијска меморија је хардверска оптимизација која користи просторни и временски локалитет и можђе се користити у више нивоа хијерархије меморије. Страничење очигледно има корист од просторног и временског локалитета. Кеш је једноставан пример експлоатације временског локалитета, јер посебно дизајниран, брз, а мали меморијски простор, углавном коришћен да би чуцао недавно референциране податке и податке близу њих, што може довести до потенцијалног повећања перформанси.
 
Подаци у кешу морају обавезно да одговарају подацима који су просторно близу у главној меморији, међутим елементи података су деведени у кеш , једну по једну кеш линију. Ово имплицира да је просторни локалитет поново важан: ако је један елемент рефернциран, неколико суседних елемената ће се такође довести у кеш. Коначно, временски локалитет игра улогу на најнижем нивоу, јер се резултати који су референцирани налазе веома близу један другом те се могу чувати у регистрима машине. Програмски језици као што је C омогућавају програмеру да предложи да се одређене променљиве чувају у регистрима.
 
Локалитет података је типична меморијска референтна карактеристика уобичајених програма(мада постоје многи неуобичајени шаблони). То чини распоред хијерархијске меморије профитабилним. У рачунарима, меморија је подељена хијерархијски да би се убрзао приступ подацима. Ниѕи нивои меморијске хијерархије теже да буду спорији, али већи. Дакле, програм ће постићи боље рерформансе ако користи меморију кеширану на вишем нивоу хијерархије, и ако избегава довођење података у виши ниво хијерархије који ће свргниту податке који ће се користити у ближој будућности. Ово је идеално, и понеда се не може постићи.
 
Типична меморијска хијерархија(времена приступа и кеш величине су приближне типичним вредностима од 2013 за потребе дискусије; стварне вредности и стварни бројеви нивоа у хијерархији могу варирати)
 
* Процесорски регистар (8-256 регистара)– тренутни приступ, и то брзином најбржег језгра процесора
* L1 CPU кеш (32 KiB to 512 [[KiB]]) – брз приступ, брзином меморијске магистрале.
* L2 CPU кеш (128 KiB to 24 [[MiB]]) – нешто спорији приступ, брзином меморијске магистрале између два језгра
* L3 CPU кеш (2 MiB to 32 [[MiB]]) – још спорији приступ, брзином меморијске магистрале између још више језгара процесора.
* Главна, физичка меморија (РАМ) (256 MiB to 64 [[GiB]]) – спор приступ, брзина која је ограничена просторном удаљености и општим хардверским интерфејсом између процесора и меморијских модула на матичној плочи.
* Диск (виртуелна меморија) (1 GiB to 256 [[TiB]]) – веома спора,
* Удаљена меморија (са других рачунара или интернета) (практично бесконачна) – брзина варира од веома спорих до невероватно спорих
 
=== Множење матрица ===
 
Заједнички пример је множење матрица:
for i in 0..n
for j in 0..m
for k in 0..p
C[i][j] = C[i][j] + A[i][k] * B[k][j];
 
 
for (ii = 0; ii < SIZE; ii += BLOCK_SIZE)
for (kk = 0; kk < SIZE; kk += BLOCK_SIZE)
for (jj = 0; jj < SIZE; jj += BLOCK_SIZE)
for (i = ii; i < ii + BLOCK_SIZE && i < SIZE; i++)
for (k = kk; k < kk + BLOCK_SIZE && k < SIZE; k++)
for (j = jj; j < jj + BLOCK_SIZE && j < SIZE; j++)
C[i][j] = C[i][j] + A[i][k] * B[k][j];
 
== Литература ==