Predmet ove vježbe su utjecaji arhitektonskih svojstava računala na izvođenje programa u višem programskom jeziku. Po mogućnosti izvedite vježbe na različitim arhitekturama (x86, ARM, ...) te usporedite rezultate.
Napisati program kojim se testira način uređenja bajtova u riječi računala. Odrediti kakav uređaj bajtova koristi arhitektura x86 te, po mogućnosti, neka druga arhitektura (npr. ARM).
Uputa: sadržaj pojedinačnih bajtova riječi otkrijte prikladnim pokazivačem.
Napomena: Noviji procesori arhitekture ARM mogu se konfigurirati tako da koriste bilo koji od dva navedena načina uređaja bajta u riječi. Vaš zadatak je otkriti koji način preferiraju prevoditelji.Cilj vježbe je analizirati utjecaj priručne memorije na performansu programa. Zadatak riješiti po slijedećim točkama:
Odrediti strukturu priručnih memorija (L1, L2) ciljnog računala, tj, kapacitet, širinu linije, i asocijativnost.
Uputa: Sasvim općenito, model procesora može se odrediti prema modelu računala ili prema računu za računalo kupljeno po komponentama. Parametri priručnih memorija mogu se pronaći na mrežnim stranicama modela procesora ili na specijaliziranim stranicama poput http://wikichip.org.
Na računalima pod Linuxom tu informaciju
možemo dobiti i od operacijskog sustava.
Dovoljno je pročitati sistemsku datoteku
/proc/cpuinfo
ili datoteke iz kazala
/sys/devices/system/cpu/
(npr. datoteku cpu0/cache/index2/size
).
cat /proc/cpuinfo
Još jedna mogućnost je osloniti se
na specijalizirane aplikacijske programe.
Primjeri takvih programa na inuxu su:
hwinfo
, lshw
,
lscpu
ili dmidecode
.
Na Windowsima postoje CPU-Z
,
System information viewer
i
x86info
.
Nedostatak ovog pristupa je potreba
za instalacijom programa.
BONUS Na procesorima s modernim varijantama arhitekture x86, ovaj zadatak možete riješiti i vlastitim programom koji poziva instrukciju CPUID (Wikipedia, Intel).
Napisati program u C-u ili C++-u koji će pokazati razliku brzine pristupa podatcima:
Uvedimo sljedeće oznake:
s1
... veličina priručne memorije L1;
b1
... veličina linije priručne memorije L1;
s2
, b2
... analogno za priručnu memoriju L2;
s3
, b3
... analogno za priručnu memoriju L3.
Program treba izmjeriti prosječnu ostvarenu propusnost pristupa bajtovima spremnika tijekom velikog broj izvođenja svakog od sljedeća četiri potprograma:
s1
redom se uvećavaju za jedan
b1
-ti bajt
memorijskog spremnika veličine 2*s1
b2
-ti bajt
memorijskog spremnika veličine 2*s2
b3
-ti bajt
memorijskog spremnika veličine 2*s3
Potprogrami B i C koriste memorijski spremnik koji je veći od priručne memorije čije promašaje analiziramo (L1, L2 ili L3), ali ipak manji od kapaciteta memorije na sljedećoj hijerarhijskoj razini (dakle, ako testiramo L1, spremnik je manji od L2).
Svaki od navedenih potprograma
treba pozivati velik broj puta,
u programskoj petlji.
Vidimo da će potprogram A
generirati promašaj priručne memorije L1 relativno rijetko
(jednom u b1
pristupa).
Potprogram B će generirati promašaj
priručne memorije L1 u svakom pristupu,
ali će velika većina tih pristupa
biti unutar priručne memorije L2.
Potprogram C će generirati promašaj
priručne memorije L2 u svakom pristupu,
ali će velika većina tih pristupa
biti unutar priručne memorije L3.
Potprogram D će generirati promašaj
priručne memorije L3 u svakom pristupu.
Za svaki potprogram potrebno je odrediti prosječno vrijeme pristupa pojedinom podatku, kao i postignutu propusnost u MB/s. Na temelju dobivenih podataka ocijeniti omjer vremena pristupa pojedinim elementima memorijske hijerarhije: t(L2)/t(L1), t(L3)/t(L2), t(RAM)/t(L3).
Upute:
0
(kako bismo spremnik učitali u najbržu priručnu memoriju koja je veća od njega
te kako optimizirajući prevoditelj ne bi pomislio da mi radimo nešto beskorisno);
<time.h>
);
-O3 -march=native
);
delta*b1
umjesto b1
bajtova
uz delta=8
;
obratite pažnju da u tom slučaju i veličinu spremnika
morate pomnožiti s istim faktorom;
Česti su programi koji 2D matrice
implementiraju linearnim spremnicima.
Ako je buf
adresa spremnika,
i
i j
indeksi retka i stupca,
a rows
i cols
dimenzije matrice,
onda odgovarajućem elementu pristupamo s buf[i*cols+j]
.
Često je potrebno istu operaciju primijeniti
nad svim elementima matrice u dvostrukoj petlji,
npr pri operaciji zbrajanja matrica.
Postavlja se pitanje što je bolje,
prvo petljati po i
pa onda po j
ili obratno.
Zadatak je eksperimentalno utvrditi ovu činjenicu
za velike matrice koje ne mogu stati u memoriju L2.
Komentirati rezultate.
Upute
N * M
slučajnih cjelobrojnih podataka (int
),
tako da M * sizeof(int)
bude jednak veličini memorije L2.
volatile
kako prevoditelju ne bi palo na pamet
izmijeniti redoslijed obilaska polja.
0
.
Cilj vježbe je analizirati utjecaj (i) ugrađenog tipa podataka te (ii) odabir elementarne operacije na performansu programa. Vezano uz program iz 2c), potrebno je napraviti sljedeće:
23
).
volatile int magic=23;
)
int
, char
, short
,
float
i double
).
-O3 -msse4
)
posix_memalign
)
Ako procesor kojeg ispitujete ima priručnu memoriju L3, u komentaru uključite i parametre s3, b3, te odredite t(RAM)/t(L3) te t(L3)/t(L2).
Preporučujemo da napravite cijelu pripremu kako biste bili spremni za kolokviranje vježbe.