jeni duke lexuar...
Ushtrime

Kujtesa kashé në veprim… Shembuj

Pavarësisht se administrimi i kujtesës kashé kryhet tërësisht prej hardwarit të procesorit, kjo nuk do të thotë se programuesi është i çliruar prej mënyrës se si kodi i shkruar prej tij do të kapë të dhënat në kujtesë. Përkundrazi!

Shfrytëzimi me mjeshtëri i vetisë së afërsisë që gëzojnë të dhënat, do të bëjë që efekti i kashesë në rritjen e performancës së një programi, të ndikojë ndjeshëm.

Shembull 1

Le të marrim në konsideratë kodin e mëposhtëm:

kashe ne veprim1

Kodi i mësipërm nuk është aspak efikas, pasi tabela A do të lexohet kolonë pas kolone, ndërkohë që në gjuhën C, tabelat vendosen në kujtesë rresht pas rreshti. Pra, kodi nuk shfrytëzon vetinë e afërsisë hapësinore të të dhënave që tabela ofron në këtë rast.

Rishkrimi i kodit sipas shembullit të mëposhtëm, do të bënte që koha e ekzekutimit, në vartësi të kompilatorit dhe të madhësisë së kujtesës kashé, të zvogëlohet me rreth 70 %.

Kashe ne veprim2Shembull 2 (marrë nga CSPP)

Le të analizojmë kodin e mëposhtëm në C:

int x[2][128];

int i;

int sum = 0;

for (i = 0; i < 128; i++) {

sum += x[0][i] * x[1][i];

}

Supozojmë  se kodi i mësipërm ekzekutohet në këto kushte:

  • sizeof(int)=4
  • vektori “x” fillon në adresën 0x0 në kujtesë dhe vendoset aty rradhë-pas-rradhe.
  • Kujtesa kashé është fillimisht bosh.
  • Kujtesa përdoret vetëm për të kapur vektorin “x”. Të gjithë variablat e tjerë gjenden në regjistra.

Të gjendet sa do të ishte vlera e  “miss rate”, për dy raste:

Rasti 1– Kujtesa kashé është 512 byte, e tipit “direct-mapped” dhe me madhësi blloku 16 byte.

Rasti 2– Kujtesa kashé është 1024 byte, e tipit “direct-mapped” dhe me madhësi blloku 16 byte.

Zgjidhje

Rasti 1

Meqenëse numri i blloqeve në kashé është 512/16 = 32 blloqe, atëherë madhësia “cache index” do të jetë 5 bit. Madhësia e bllokut prej 16 byte, do të bëjë që “Byte select” = 4 bit.

Kujtesa do të lexohet sipas kësaj sekuence  :  x[0][0], x[1][0], x[0][1], x[1][1], ……. , ose në përgjithësi x[0][i], x[1][i].

Madhësia e një rreshti të vektorit “x” është 128×4 = 512 byte. Pra, sekuencat e leximit të kujtesës, do të gjenden të zhvendusura me 512 Byte, aq sa është edhe madhësia e kashesë. Rrjedhimisht leximet e vektorit “x”,  do të shkaktonin të gjitha “conflict misses” . Kështu psh:

x[0][0] – adresa x  000000000

x[1][0] – adresa x1000000000

x[0][1] – adresa x   000000001

x[1][1] – adresa x1000000001

e kështu me rradhë…

Meqenëse të gjithë akseset në kujtesës do të shoqëroheshin me « conflict misses », atëherë për kodin e mësipërm, do të kishim që “cashe miss » =100 %.

Rasti 2

Në një kujtesë kashé 1024 KByte do të vendoseshin lirshëm të dy rreshtat e vektorit “x”. Për pasojë nuk do të kishte më « conflict misses », por vetëm « compulsory misses » për çdo bllok të ri me madhësi 16 Byte = 4 i. Pra, për çdo rresht, numri i “miss” do të ishte : 128/4 = 32 misses.  Pra, “cache miss” = 64/256 = 25 %.

Diskutim

Ende pa komente.

Lini një Përgjigje

Ju lutemi, bëni hyrjen me një nga këto metoda që të postoni komentin tuaj:

Stema e WordPress.com-it

Po komentoni duke përdorur llogarinë tuaj WordPress.com. Dilni / Ndryshojeni )

Foto Twitter-i

Po komentoni duke përdorur llogarinë tuaj Twitter. Dilni / Ndryshojeni )

Foto Facebook-u

Po komentoni duke përdorur llogarinë tuaj Facebook. Dilni / Ndryshojeni )

Foto Google+

Po komentoni duke përdorur llogarinë tuaj Google+. Dilni / Ndryshojeni )

Po lidhet me %s

Këtë e pëlqejnë %d blogues: