Sekvenční architektury. Optimalizace přístupu do paměti Pamět ový subsystém PC Statické paměti Dynamické paměti Cache

Podobné dokumenty
Paměťový podsystém počítače

Operační systémy. Jednoduché stránkování. Virtuální paměť. Příklad: jednoduché stránkování. Virtuální paměť se stránkování. Memory Management Unit

Systém adresace paměti

Přednáška. Správa paměti II. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

Mezipaměti počítače. L2 cache. L3 cache

Struktura a architektura počítačů (BI-SAP) 11

Paměti EEPROM (1) Paměti EEPROM (2) Paměti Flash (1) Paměti EEPROM (3) Paměti Flash (2) Paměti Flash (3)

Pokročilé architektury počítačů

Paměti cache. Cache může být realizována softwarově nebo hardwarově.

Paměti Josef Horálek

Pohled do nitra mikroprocesoru Josef Horálek

Paměti. Paměť je zařízení, které slouží k ukládání programů a dat, s nimiž počítač pracuje

Operační systémy. Přednáška 8: Správa paměti II

Struktura a architektura počítačů (BI-SAP) 10

Operační paměti počítačů PC

Optimalizace. Optimalizace. Profilování. Gprof. Gcov. Oprofile. Callgrind. Intel Vtune. AMD CodeAnalyst

Hlavní využití počítačů

Paměti a jejich organizace

Paměti EEPROM (1) 25/07/2006 1

Sběrnicová struktura PC Procesory PC funkce, vlastnosti Interní počítačové paměti PC

Dělení pamětí Volatilní paměti Nevolatilní paměti. Miroslav Flídr Počítačové systémy LS /11- Západočeská univerzita v Plzni

Sběrnicová struktura PC Procesory PC funkce, vlastnosti Interní počítačové paměti PC

Paměti operační paměti

PROCESOR. Typy procesorů

Paměť počítače. 0 (neprochází proud) 1 (prochází proud)

Paměťové prvky. ITP Technika personálních počítačů. Zdeněk Kotásek Marcela Šimková Pavel Bartoš

Architektura počítače

Obecné výpočty na GPU v jazyce CUDA. Jiří Filipovič

Cache paměti (2) Cache paměti (1) Cache paměti (3) Cache paměti (4) Cache paměti (6) Cache paměti (5) Cache paměť:

Pamět ová hierarchie, návrh skryté paměti cache 2

Sběrnicová struktura PC Procesory PC funkce, vlastnosti Interní počítačové paměti PC

Cache paměť - mezipaměť

Procesor. Procesor FPU ALU. Řadič mikrokód

Roman Výtisk, VYT027

09. Memory management. ZOS 2006, L.Pešička

Pamět ová hierarchie, virtuální pamět. doc. Ing. Róbert Lórencz, CSc.

2.8 Procesory. Střední průmyslová škola strojnická Vsetín. Ing. Martin Baričák. Název šablony Název DUMu. Předmět Druh učebního materiálu

Přidělování paměti II Mgr. Josef Horálek

Paměťová hierarchie. INP 2008 FIT VUT v Brně

Cache paměti (1) Cache paměť: V dnešních počítačích se běžně používají dva, popř. tři druhy cache pamětí:

Technické prostředky počítačové techniky

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

Matematika v programovacích

MSP 430F1611. Jiří Kašpar. Charakteristika

Princip funkce počítače

Něco málo o časování a frekvenci

Paměti Flash. Paměti Flash. Základní charakteristiky

asociativní paměti Ing. Jakub Št astný, Ph.D. 1 Katedra teorie obvodů FEL ČVUT Technická 2, Praha 6,

Základní deska (1) Parametry procesoru (2) Parametry procesoru (1) Označována také jako mainboard, motherboard

Základní deska (1) Označována také jako mainboard, motherboard. Deska plošného spoje tvořící základ celého počítače Zpravidla obsahuje:

Operační systémy. Přednáška 7: Správa paměti I

Přednáška. Správa paměti I. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

Uspořádání cache pamětí procesorů historie a současný stav

Pokročilé architektury počítačů

Pamět ová hierarchie, návrh skryté paměti 2. doc. Ing. Róbert Lórencz, CSc.

Semestrální práce z předmětu Speciální číslicové systémy X31SCS

Metody připojování periferií BI-MPP Přednáška 2

Paměti Rambus DRAM (RDRAM) Paměti Flash Paměti SGRAM

Cílem kapitoly je seznámit studenta s pamětmi. Jejich minulostí, současností a hlavnímu parametry.

Pokročilé architektury počítačů

Referát (pokročilé architektury počítačů)

Přidělování zdrojů (prostředků)

Využití ICT pro rozvoj klíčových kompetencí CZ.1.07/1.5.00/

Architektura Intel Atom

Ro R dina procesor pr ů Int In e t l Nehalem Šmída Mojmír, SMI108 PAP PA 2009

Rychlá vyrovnávací paměť v architektuře PC

IUJCE 07/08 Přednáška č. 6

Přednášky o výpočetní technice. Hardware teoreticky. Adam Dominec 2010

Základy informatiky. 2. Přednáška HW. Lenka Carr Motyčková. February 22, 2011 Základy informatiky 2

Informační a komunikační technologie

Přehled paralelních architektur. Dělení paralelních architektur Flynnova taxonomie Komunikační modely paralelních architektur

Operační systémy. Správa paměti (SP) Požadavky na SP. Spojování a zavedení programu. Spojování programu (linking) Zavádění programu (loading)

Činnost CPU. IMTEE Přednáška č. 2. Několik úrovní abstrakce od obvodů CPU: Hodinový cyklus fáze strojový cyklus instrukční cyklus

Paměti Rambus DRAM (RDRAM) Paměti Flash Paměti SGRAM

Paralelní architektury se sdílenou pamětí typu NUMA. NUMA architektury

Vstupně - výstupní moduly

Hardware - komponenty počítačů Von Neumannova koncepce počítače. Von Neumannova koncepce počítače

SDRAM (synchronní DRAM) Cíl přednášky:

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Intel (2) Intel (1) Intel (3) Intel (4) Intel (6) Intel (5) Nezřetězené zpracování instrukcí:

Paměti EEPROM (1) Paměti EEPROM (2) Paměti Flash (1) Paměti EEPROM (3) Paměti Flash (2) Paměti Flash (3)

Strojový kód k d a asembler procesoru MIPS SPIM. MIPS - prostředí NMS NMS. 32 ks 32bitových registrů ( adresa registru = 5 bitů).

Procesor Intel Pentium (1) Procesor Intel Pentium (3) Procesor Intel Pentium Pro (1) Procesor Intel Pentium (2)

Miroslav Flídr Počítačové systémy LS /21- Západočeská univerzita v Plzni

2.9 Vnitřní paměti. Střední průmyslová škola strojnická Vsetín. Ing. Martin Baričák. Název šablony Název DUMu. Předmět Druh učebního materiálu

Identifikátor materiálu: ICT-1-08

Server je v informatice obecné označení pro počítač, který poskytuje nějaké služby nebo počítačový program, který tyto služby realizuje.

Paměti SDRAM (synchronní DRAM)

Parametry pamětí vybavovací doba (tj. čas přístupu k záznamu v paměti) = 10 ns ms rychlost toku dat (tj. počet přenesených bitů za sekundu)

Vstupně výstupní moduly. 13.přednáška

Základní uspořádání pamětí MCU

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

AGP - Accelerated Graphics Port

Mikrokontroléry. Doplňující text pro POS K. D. 2001

Paměti personálních počítačů, vývoj pojmů, technologie, organizace

Paměti personálních počítačů, vývoj pojmů, technologie, organizace

Sekvenční architektury II. Zpracování instrukcí

Úvod do OpenMP. Jiří Fürst

ÚVOD DO OPERAČNÍCH SYSTÉMŮ. Správa paměti. Přímý přístup k fyzické paměti, abstrakce: adresový prostor, virtualizace, segmentace

CHARAKTERISTIKY MODELŮ PC

Transkript:

Sekvenční architektury Sekvenční architektury Optimalizace přístupu do paměti Pamět ový subsystém PC Statické paměti Dynamické paměti Cache

Sekvenční architektury Definition Za sekvenční systém budeme považovat systém založený na von Neumannově architektuře s jednou centrální jednotkou - CPU. Sekvenční systém může být doplněn o aritmeticko logickou jednotku - ALU.

Von Neumannova architektura - připomenutí RAM CPU Timer I/O

Jak urychlit výpočet na sekvenčním systému?

Jak urychlit výpočet na sekvenčním systému? na straně hardware zrychlit spojení mezi CPU a RAM zvýšit výkon CPU na straně software optimalizovat přístup do paměti eliminovat zbytečné instrukce programu nebo instrukce náročné na provedení

Pamět ový subsystém PC Zdroj: Henessy, Patterson, Computer architecture: A quantitative approach, Morgan Kaufmann, 2011.

Pamět ový subsystém PC Výkon CPU roste mnohem rychleji než rychlost RAM: memory wall Von Neumann bottleneck Rychlost komunikace mezi pamětí a procesorem je dána: latencí (latency) udává, za jak dlouho je pamět ový modul schopný vyhledat požadovaná data je podstatná tehdy, pokud čteme malé bloky dat z různých míst v paměti přenosovou rychlostí (bandwidth) udává, jak rychle lze přenášet bloky dat po jejich nalezení uplatní se při práci s velkými souvislými bloky dat

Pamět ový subsystém PC Rozlišujeme dva základní typy pamětí: statická pamět - static RAM dynamická pamět - dynamic RAM

Statická pamět jeden bit je reprezentován 6 tranzistory tato pamět je velmi rychlá a nevyžaduje žádné obnovovací cykly využívá se zejména pro cache procesorů je velmi drahá

Dynamická pamět jeden bit je reprezentován 1 tranzistorem a 1 kondenzátorem tato pamět je jednodušší, ale vyžaduje obnovovací cykly pro dobíjení kondenzátoru kondenzátory se vybíjejí při čtení, ale i samovolně během obnovovacího cyklu nelze s pamětí pracovat tento typ paměti je ale výrazně menší (a tedy levnější) než statická pamět a má menší spotřebu energie

Organizace dynamické paměti DRAM nelze organizovat lineárně tj. připojit každou pamět ovou buňku k CPU přímo při 4 Gb RAM by to vyžadovalo 2 32 spojů adresa buňky se proto zakóduje jako binární číslo a je pak zpracována demultiplexorem aby nemusel být demultiplexor příliš složitý, organizuje se DRAM do 2D pole

Přístup do DRAM celá adresa se rozdělí na index řádku (RAS) a index sloupce (CAS) pamět ový modul nejprve přijme RAS a "připojí" požadovaný řádek následně přijme CAS a "připojí" požadovanou buňku pokud pracujeme s několika buňkami v jednom řádku, lze k nim přistupovat jen pomocí poslání jednoho RAS a několika CAS to může být výrazně rychlejší je lepší zpracovávat data sekvenčně nebo v malých blocích, než náhodně přistupovat na různá místa v paměti

Typy pamětí DRAM Nejčastěji se používá synchronní DRAM tj. SDRAM. nejjednodušší typ je SDR SDRAM (Single Data Rate SDRAM) pamět ový modul a sběrnice jsou taktovány stejně tj. 100-266 MHz. při 100 MHz je datová propustnost 100, 000, 000 64b/s = 800MB/s.

Typy pamětí DRAM Nástupce pamětí SDR SDRAM je DDR SDRAM (Double Data Rate SDRAM) na rozdíl od SDR SDRAM přenáší data i na sestupné hraně signálu aby bylo co přenášet, obsahuje pamět ový modul vyrovnávací pamět, která je připojena ke dvěma pamět ovým čipům při 100 MHz je datová propustnost 2 100 64Mb/s = 1, 600MB/s. zvýšila se tím datová propustnost, aniž by se navýšil takt pamět ových modulů, což by bylo energeticky velmi náročné

Typy pamětí DRAM DDR2 SDRAM - zvyšuje frekvenci přenosu dat na dvojnásobek pamět ové čipy jsou taktovány stejně, ale řadič pracuje rychleji proto je potřeba číst v jednom taktu z celkem 4 čipů při 100 MHz je datová propustnost 4 100, 000, 000 64b/s = 3, 200MB/s při 266 MHz je datová propustnost 4 266, 000, 000 64b/s = 8, 512MB/s

Typy pamětí DRAM DDR3 SDRAM - zvyšuje frekvenci přenosu dat na čtyřnásobek při 100 MHz je datová propustnost 8 100, 000, 000 64b/s = 6, 400MB/s při 266 MHz je datová propustnost 8 266, 000, 000 64b/s = 17, 024MB/s DDR4 SDRAM - navyšují takty pamět ových modulů (dostupné od roku 2014) při 200 MHz je datová propustnost 8 200, 000, 000 64b/s = 12, 800MB/s při 300 MHz je datová propustnost 8 300, 000, 000 64b/s = 19, 200MB/s Standard DDR5 se plánuje na rok 2020.

Typy pamětí DRAM viděli jsme, jak dochází k urychlení přenosu dat mezi CPU a RAM bylo ho dosaženo jen díky paralelnímu přístupu do více pamět ových modulů z modulu se čte blok 64 bitů = 8 bytů najednou pokud program ale využije jen jeden byte, není datová sběrnice využita plně efektivně podobný trik využívá i technologie Dual/Triple/Quad channel data se ukládají do dvou,tří nebo čtyř pamět ových modulů na přeskáčku DDR 4 quad channel 4 19.2GB/s = 76.8GB/s Žádná z jmenovaných technologii zatím výrazně nesnížila latenci.

Cache Za tím účelem se používají malé a rychlé vyrovnávací pamětí postavené na čipech SRAM - cache jde o poměrně malou ale velice rychlou pamět velikost je řádově 1/1000 velikosti operační paměti přístup do RAM je cca. 200 cyklů CPU přístup do cache je 3-15 cyklů CPU je implementována přímo na stejném čipu jako procesor a běží na stejném taktu v cache se udržuje kopie některých dat z operační paměti, pokud se pracuje s těmito daty, CPU sahá přímo do cache a ne do pomalé operační paměti využívá se faktu, že u operační paměti je snazší zvýšit přenosovou rychlost, než zkrátit latenci do cache se načítají větší souvislé bloky dat, ke kterým je pak rychlejší přístup správa cache je plně v režii CPU, programátor nebo OS mají jen malou možnost ovlivnit cache

Cache současné procesory obsahují několik úrovní cache označují se L1, L2 a L3 L1 se dělí na datovou a instrukční čím menší číslo, tím menší ale rychlejší cache je

Cache CPU se snaží, aby cache obsahovala ta data, se kterými program právě pracuje. procesor předpokládá, že právě běžící program pracuje s menšími ucelenými bloky dat a nepřistupuje do operační paměti na zcela náhodné adresy tomu se říká prostorová lokalita - spatial locality dále se předpokládá, že program nejprve zpracuje jeden blok dat, pak se posune k dalšímu bloku a k tomu původnímu se nevrací to je časová lokalita - temporal locality

Cache procesor provádí tzv. prefetching, tj. načítání dat s předstihem pokouší se odhadnout, jaká data budou brzy potřeba a načíst si je do cache dřív, než si o to řekne program sám pak je schopen k nim poskytnout mnohem rychlejší přístup

Jak funguje cache? data se do cache přenáší ve větších blocích, nejčastěji 64 bytů, což se provede v celkem 8 přenosech SDRAM jsou pro tento přenos optimalizovány a ušetří se tím vysílaní RAS a CAS signálů bloku dat, který je přenesen do cache najednou se říká cache line každá cache line musí být označena podle své adresy v operační paměti pokud chce program pracovat s určitou adresou, musí procesor nejprve zjistit, zda má tato data kešovaná nebo ne to musí být pochopitelně velmi rychlé

Plně asociativní cache Nejjednodušší přístup k organizování cache je fully associative cache...

Plně asociativní cache O 0 T A G 0 0 0 0 0 0 1 0 0 0 2 0 0 0 1 0 0 0 0 1 1 3 00 0 1 1 0 0 0 1 0 4 0 0 1 0 0 0 0 0 1 1 0 01 01 0 0 0 4 6 00 1 10 01 0 0 1 5 EI 35 02 11 101 100 17 no001 2 1 3 25 1 7 00 a 1 1 10 0 0 O 8 0 1 0 0 0 1 0 0 0 1 7 g 01 1 0 0 1 0 A 0 1 1 01 1 1 12 01 1 00 CACHE 1 3 01 1 0 1 ( CACHE LINE = 1 B) 1 4 0 1 1 10 1 5 01 1 1 1 1 6 10 0 0 0 1 8 10 0 1 0 RAM 1 9 r 0 0 l 1 PLNEASOCIATIVNT CACHE POJME 2 0 10 1 00 LIBOUOLNOU KONDINACIADRES. 2 2 10 1 1 0 l l 1 2 4 11 0 0 O 2 6 11 0 l 0 1 2 7 1 101 2 8 11 1 0 0 1 2 9 1 1 30 1 1 01 1 0 3 1 1 1 1 11

Plně asociativní cache u plně asociativní cache přísluší každé cache line jeden komparátor, který porovná tag uložené cache line s cache line, která je vyžadovaná od CPU

Plně asociativní cache Na systémech s 32-bitovým adresováním se... celá adresa se rozdělí na tag a offset offset odpovídá adrese v rámci cache line, tj. má velikost O = 6 bitů zbývající část T = 26 bitů připadne tagu Obrázek : T = 26, S = 0 a O = 6

Plně asociativní cache jednotlivé cache line mohou odpovídat libovolným místům v paměti při velikosti cache 4 MB, máme celkem 4M/64 = 65, 536 komparátorů to by bylo velice náročné z hardwarového pohledu a drahé na výrobu Další možností je zkonstruovat cache s přímým mapováním direct mapped cache...

Cache s přímým mapováním O 0 0 0 0 TAG ) CACHESET 0 0 0 0 1 2 0 0 0 1 0 0 0 1 1 0 3 00 0 1 l 0 0 01 0 2 # e 0 O 4 00 l 0 0 0 0 0 l 1 3 5 00 1 0 1 1 00 4 6 00 re 0 10 5 7 00 11 l 11 0 6 8 01 000 11 l 7 9 01 00 1 1 0 0 1 0 R 0 1 1 01 0 l l 1 2 01 no CACHE 1 3 01 1 1 ( CACHE LINE = 1 B) 1 4 0 e 1 R 0 1 5 01 R 1 l 1 6 10 0 0 0 17 ^ 0 001 1 8 10 Ol 0 RAM 1 9 r 0 0 l l CACHE SPRYMY 'n MAPOVAHIM 2 0 1 0 l 0 0 NEUDRZINAJEDNOU DUE ADRESY 2 1 10 1 0 1 USICT SE 0 CECOCISECNY ' NAIOBEK 2 2 10 1 R 0 UEUKOSTI CACHE. 2 3 10 1 1 1 24 1 1 00 0 2 5 1 1 00 1 2 6 11 0 10 2 7 1 1 01 1 2 8 11 1 0 0 2 9 1 1 10 e 3 0 1 1 1 10 3 1 1 l a r r

Cache s přímým mapováním pokud CPU potřebuje vyhledat data v cache, podívá se na část adresy odpovídající cache set okamžitě ví, kam má do cache sáhnout (to provádí multiplexor) aby zjistil, zda je zde uložena požadovaná cache line, provede porovnání těch částí adresy, které odpovídají tagu na to stačí jeden komparátor

Cache s přímým mapováním

Cache s přímým mapováním mějme opět 4 MB cache tj. 65, 536 cache line celou operační pamět si můžeme rozdělit právě na 65, 536 segmentů, kterým se říká cache set každou cache set lze adresovat pomocí 16 bitů spolu s offsetem to dělá 16 + 6 = 22 bitů zbylých 10 bitů zůstává pro tag Obrázek : T = 10, S = 16 a O = 6

Cache s přímým mapováním tento typ cache je mnohem jednodušší na konstrukci problém je, že nelze mít v cache dvě cache line, které se liší jen tagem takové adresy se opakují po 2 16+6 = 4M, tj. velikost cache to sice dobře souhlasí s podmínkou spatial locality, ale jakmile aplikace pracuje s větším blokem paměti, je tento přístup neefektivní V praxi se volí kombinace obou přístupů, tj. set associative cache...

, Set associative cache 0 0 0 0 TAG CACHE SET 00 01 0-0%002 000-0124 17 ^ 0001 111 101 100 2 1 25 1 2 9 3 0 1 1 1 10 3 1 1 1 1

Set associative cache celou cache rozdělíme na menší počet cache sets, ale do každé z nich umožníme uložit větší počet cache line 2, 4 nebo 8 velikost cache set adresy se zmenší o 1, 2 nebo 3 bity a tagová část se příslušně zvětší multiplexor vybere příslušnou cache set v ní je nyní 2 až 8 cache lines pomocí 2 až 8 komparátorů se provede porovnání tagové adresy

Set associative cache

Set associative cache L2 Cache Size Associativity Direct 2 4 8 CL=32 CL=64 CL=32 CL=64 CL=32 CL=64 CL=32 CL=64 512k 27,794,595 20,422,527 25,222,611 18,303,581 24,096,510 17,356,121 23,666,929 17,029,334 1M 19,007,315 13,903,854 16,566,738 12,127,174 15,537,500 11,436,705 15,162,895 11,233,896 2M 12,230,962 8,801,403 9,081,881 6,491,011 7,878,601 5,675,181 7,391,389 5,382,064 4M 7,749,986 5,427,836 4,736,187 3,159,507 3,788,122 2,418,898 3,430,713 2,125,103 8M 4,731,904 3,209,693 2,690,498 1,602,957 2,207,655 1,228,190 2,111,075 1,155,847 16M 2,620,587 1,528,592 1,958,293 1,089,580 1,704,878 883,530 1,671,541 862,324 Tabulka : Efekt velikosti cache, asociativity a cache line na počet "cache misses". Testováno na gcc. V linuxu lze asociativitu cache zjistit příkazem: cat /sys/devices/system/cpu/cpu0/cache/index0/ways_of_associativity

Efekt cache Příklad: Budeme procházet následující spojový seznam: 1 template < i n t Size > 2 class ArrayElement 3 { 4 ArrayElement next ; 5 long i n t data [ Size ] ; 6 } všechny prvky seznamu se alokují jako velké pole následně se propojí bud sekvenčně nebo náhodně

Efekt cache seznam budeme pouze opakovaně procházet a budeme načítat první položku v poli data hodnota Size simuluje různou velikost jednoho prvku seznamu long int má stejnou velikost jako ukazatel, tj. 32 nebo 64 bitů podle toho, jestli máme 32 nebo 64 bitový systém

Efekt cache 250 15 200 CPU tics/element 150 100 Bandwidth in GB/sec 10 5 50 0 1 kb 4 kb 16 kb 64 kb 256 kb 1 MB 4 MB 16 MB 64 MB Array size 0 1 kb 4 kb 16 kb 64 kb 256 kb 1 MB 4 MB 16 MB 64 MB Array size Obrázek : Výsledky s náhodným procházením pole na Intel Core 2 s 16Kb L1 cache, 4MB L2 cache a pamětmi DDR2. RAM 200 cyklů L2 cache 15 cyklů L1 cache 4 cykly

Efekt cache CPU tics/element 200 150 100 50 1 2 4 8 16 32 64 128 256 0 1 kb 4 kb 16 kb 64 kb 256 kb 1 MB 4 MB 16 MB 64 MB Array size Bandwidth in GB/sec 15 10 1 2 5 4 8 16 32 64 128 256 0 1 kb 4 kb 16 kb 64 kb 256 kb 1 MB 4 MB 16 MB 64 MB Array size Obrázek : Výsledky se sekvenčním procházením pole s různou velikosti Size na Intel Core 2 s 16Kb L1 cache a 4MB L2 cache.

Efekt cache - prefetching procesor provádí prefetching, tj. načítá několik cache line dopředu je-li Size = 1, do jedné cache line se vejde 8 prvků pole je-li Size = 8 je to jen 1 je-li Size = 32 je jeden element čtyřikrát větší než cache line

Efekt cache 250 200 Random Sequential 15 CPU tics/element 150 100 Bandwidth in GB/sec 10 5 50 0 1 kb 4 kb 16 kb 64 kb 256 kb 1 MB 4 MB 16 MB 64 MB Array size Random Sequential 0 1 kb 4 kb 16 kb 64 kb 256 kb 1 MB 4 MB 16 MB 64 MB Array size Obrázek : Porovnání náhodné a sekvenční procházení pole na Intel Core 2 s 16Kb L1 cache a 4MB L2 cache.

Efekt cache 20 18 16 AMD Phenom 2 1075T Intel i7 3770K Intel Core2 E6600 20 18 AMD Phenom 2 1075T Intel i7 3770K AMD FX 6100 Intel Core2 E6600 Bandwidth in GB/sec 14 12 10 8 6 Bandwidth in GB/sec 16 14 12 10 4 2 8 0 1 kb 4 kb 16 kb 64 kb 256 kb 1 MB 4 MB 16 MB 64 MB Array size 6 1 kb 4 kb 16 kb 64 kb 256 kb 1 MB 4 MB 16 MB 64 MB Array size Obrázek : Porovnání náhodného a sekvenčního čtení pro různé procesory. AMD Phenom2 1075T 64 kb L1, 512 kb L2, 6 MB L3, 3.0-3.5 GHz, Q3 2010 Intel i7 3770K 32 kb L1, 256 kb L2, 8 MB L3, 3.5-39 GHz, Q2 2012 AMD FX 6100 48 kb L1, 1024 kb L2, 8 MB L3, 3.3-3.9 GHz, 2011 Q4 Intel Core2 E6600 16 kb L1, 4 MB L2, 2.4 Ghz, Q3 2006

Zapisování dat pokud je nějaká cache line změněna, jsou dvě možnosti, co udělat provést okamžitý zápis do RAM write-through cache je to jednoduchá strategie, ale na příliš účinná pokud program opakovaně zapisuje do stejné proměnné, je většina zápisů do operační paměti zbytečná provést zápis do RAM později write-back cache cache line se označí jako dirty ve chvíli, kdy je potřeba uvolnit nějaká data z cache, kontroluje se zda cache line není takto označena a pokud ano, provede se zápis do RAM

Efekt cache 250 Read Write 6 Read Write 200 Bandwidth in GB/sec 150 100 Bandwidth in GB/sec 4 50 0 1 kb 4 kb 16 kb 64 kb 256 kb 1 MB 4 MB 16 MB 64 MB Array size 2 1 kb 4 kb 16 kb 64 kb 256 kb 1 MB 4 MB 16 MB 64 MB Array size Obrázek : Porovnání procházení pole náhodně a sekvenčně se čtením a zápisem na Intel Core 2 s 16Kb L1 cache a 4MB L2 cache.

Efekt cache Testy nám ukazují, že: vždy se vyplatí využívat maximálně data, která máme již v cache sekvenční přístup do paměti je mnohem rychlejší než náhodný procházení pole je mnohem rychlejší, než procházení spojového seznamu při procházení pole s rostoucí velikostí ArrayElement klesá efektivita, protože využíváme jen některá data načtená do cache Pokud to jde: ukládáme data do paměti sekvenčně organizovaná tak, jak k nim nejčastěji přistupujeme to je důsledek spatial locality a prefetchingu pokud s daty pracujeme během výpočtu opakovaně, je lepší rozdělit výpočet na menší bloky, které se vejdou do cache to je důsledek temporal locality

Efekt cache Příklad: Může být výhodné nahradit pole struktur 1 struct Element 2 { 3 SmallKey key ; 4 BigData data ; 5 } za pole struktur 1 struct Element 2 { 3 SmallKey key ; 4 BigData data ; 5 } Při procházení pole a vyhledávání podle klíče se nebude cache zahlcovat samotnými daty, která nás většinou nezajímají.

Efekt cache - sčítání matic Příklad: Program matrix-addition testuje sčítání matic. Matice jsou v paměti uloženy po řádcích. Jsou dvě možnosti jak matice sčítat: 1 void addmatrixrowwise ( const ArrayMatrix < Real >& m ) 2 { 3 for ( i n t i = 0; i < size ; i ++ ) 4 for ( i n t j = 0; j < size ; j ++ ) 5 this >matrix [ i size + j ] += 6 m. matrix [ i size + j ] ; 7 } 1 void addmatrixcolumnwise ( const ArrayMatrix < Real >& m ) 2 { 3 for ( i n t j = 0; j < size ; j ++ ) 4 for ( i n t i = 0; i < size ; i ++ ) 5 this >matrix [ i size + j ] += 6 m. matrix [ i size + j ] ; 7 } Pro zajímavost uděláme to samé s matici uloženou pomocí kontejneru vector ze standardní knihovny STD.

Efekt cache - sčítání matic GFLOPS 2.4 2.2 2 1.8 1.6 1.4 1.2 1 0.8 0.6 0.4 0.2 STD row wise STD column wise Array row wise Array column wise 0 16 32 64 128 256 512 1024 2048 4096 8192 Matrix size GFLOPS 2.4 2.2 2 1.8 1.6 1.4 1.2 1 0.8 0.6 0.4 0.2 STD row wise STD column wise Array row wise Array column wise 0 16 32 64 128 256 512 1024 2048 4096 8192 Matrix size Obrázek : Porovnání násobení matice s přístupem po řádcích a po sloupcích, uloženou jako pole nebo pomocí STD třídy vector na Intel Core2 Duo E6600 (vlevo) a AMD Phenom2 X6 1075T (vpravo).

Efekt cache - násobení matic Příklad: Při násobení matic se ale přístupu po sloupcích nevyhneme. 1 void m u l t i p l y M a t r i c e s ( const ArrayMatrix < Real >& m1, 2 const ArrayMatrix < Real >& m2 ) 3 { 4 for ( i n t i = 0; i < size ; i ++ ) 5 for ( i n t j = 0; j < size ; j ++ ) 6 { 7 Real aux ( 0.0 ) ; 8 for ( i n t k = 0; k < size ; k++ ) 9 aux += m1. mat ri x [ i size + k ] 10 m2. m a t r i x [ k size + j ] ; 11 this >ma tr ix [ i size + j ] = aux ; 12 } 13 }

Efekt cache - násobení matic 2 1.5 GFLOPS 1 0.5 Baseline 0 16 32 64 128 256 512 1024 2048 4096 Matrix size Obrázek : Klasický algoritmus pro násobení matic na AMD Phenom 2 X6 1075T.

Efekt cache - násobení matic Pomůžeme si tím, že druhou matici si nejprve transponujeme: 1 void m u l t i p l y M a t r i c e s W i t h T r a n s p o s i t i o n ( const ArrayMatrix < Real >& m1, 2 const ArrayMatrix < Real >& m2 3 { 4 Real transposedmatrix = new Real [ size size ] ; 5 for ( i n t i = 0; i < size ; i ++ ) 6 for ( i n t j = 0; j < size ; j ++ ) 7 transposedmatrix [ i size + j ] = 8 m2. m a t r i x [ j size + i ] ; 9 10 for ( i n t i = 0; i < size ; i ++ ) 11 for ( i n t j = 0; j < size ; j ++ ) 12 { 13 Real aux ( 0.0 ) ; 14 for ( i n t k = 0; k < size ; k++ ) 15 aux += m1. mat ri x [ i size + k ] 16 transposedmatrix [ j size + k ] ; 17 this >ma tr ix [ i size + j ] = aux ; 18 } 19 20 delete [ ] transposedmatrix ; 21 }

Efekt cache - násobení matic 2 1.5 GFLOPS 1 0.5 Baseline Transposition 0 16 32 64 128 256 512 1024 2048 4096 Matrix size Obrázek : Klasický algoritmus pro násobení matic a algoritmus s transpozicí na AMD Phenom 2 X6 1075T.

Efekt cache - násobení matic provádět transpozici ale může výrazně zvýšit nároky na pamět jinou možností je provést násobení blokově 1 template < i n t blocksize = 16 > 2 void m u l t i p l y M a t r i c e s B l o c k w i s e 1 ( const ArrayMatrix < Real >& m1, 3 const ArrayMatrix < Real >& m2 ) 4 { 5 memset ( this >matrix, 0, size size sizeof ( Real ) ) ; 6 for ( i n t i = 0; i < size ; i += blocksize ) 7 for ( i n t j = 0; j < size ; j += blocksize ) 8 for ( i n t k = 0; k < size ; k += blocksize ) 9 { 10 for ( i n t i 1 = i ; i 1 < i + blocksize ; i 1 ++ ) 11 for ( i n t j 1 = j ; j 1 < j + blocksize ; j 1 ++ ) 12 for ( i n t k1 = k ; k1 < k + blocksize ; k1++ ) 13 this >m a t r i x [ i 1 size + j 1 ] += 14 m1. m a t r i x [ i 1 size + k1 ] 15 m2. m a t r i x [ k1 size + j 1 ] ; 16 } 17 } 18 }

Efekt cache - násobení matic 2 1.5 GFLOPS 1 0.5 Baseline Transposition Blocks 1 0 16 32 64 128 256 512 1024 2048 4096 Matrix size Obrázek : Klasický algoritmus pro násobení matic, algoritmus s transpozicí a blokový algoritmus na AMD Phenom 2 X6 1075T.

Efekt cache - násobení matic výkon je ale překvapivě dost slabý důvodem je náročná aritmetika s ukazateli na řádcích 13, 14 a 15 provedeme optimalizaci 1 template < i n t blocksize = 16 > 2 void m u l t i p l y M a t r i c e s B l o c k w i s e 2 ( const ArrayMatrix < Real >& m1, 3 const ArrayMatrix < Real >& m2 ) 4 { 5 memset ( this >matrix, 0, size size sizeof ( Real ) ) ; 6 for ( i n t i = 0; i < size ; i += blocksize ) 7 for ( i n t j = 0; j < size ; j += blocksize ) 8 for ( i n t k = 0; k < size ; k += blocksize ) 9 { 10 Real res = &this >matrix [ i size + j ] ; 11 Real _m1 = &m1. matrix [ i size + k ] ; 12 for ( i n t i 1 = 0; 13 i 1 < blocksize ; 14 i1 ++, res += size, _m1 += size ) 15 for ( i n t j1 = 0; j1 < blocksize ; j1 ++ ) 16 { 17 Real _m2 = &m2. matrix [ k size + j ] ; 18 for ( i n t k1 = 0; 19 k1 < blocksize ; 20 k1++, _m2 += size ) 21 res [ j 1 ] += _m1[ k1 ] _m2[ j 1 ] ; 22 } 23 } 24 }

Efekt cache - násobení matic 2.5 2 GFLOPS 1.5 1 0.5 Baseline Transposition Blocks 1 Blocks 2 0 16 32 64 128 256 512 1024 2048 4096 Matrix size Obrázek : Klasický algoritmus pro násobení matic, algoritmus s transpozicí a blokový algoritmus na AMD Phenom 2 X6 1075T.

Efekt cache - násobení matic dál si můžeme všimnout, že prohozením smyček pro j1 a k1 lze počet operací dále zredukovat (ukazatel _m2 spravujeme nešikovně) 1 template < i n t blocksize = 16 > 2 void m u l t i p l y M a t r i c e s B l o c k w i s e 3 ( const ArrayMatrix < Real >& m1, 3 const ArrayMatrix < Real >& m2 ) 4 { 5 memset ( this >matrix, 0, size size sizeof ( Real ) ) ; 6 for ( i n t i = 0; i < size ; i += blocksize ) 7 for ( i n t j = 0; j < size ; j += blocksize ) 8 for ( i n t k = 0; k < size ; k += blocksize ) 9 { 10 Real res = &this >matrix [ i size + j ] ; 11 Real _m1 = &m1. matrix [ i size + k ] ; 12 for ( i n t i 1 = 0; 13 i 1 < blocksize ; 14 i1 ++, res += size, _m1 += size ) 15 { 16 Real _m2 = &m2. matrix [ k size + j ] ; 17 for ( i n t k1 = 0; 18 k1 < blocksize ; 19 k1++, _m2 += size ) 20 for ( int j1 = 0; j1 < blocksize ; j1 ++ ) 21 res [ j 1 ] += _m1[ k1 ] _m2[ j 1 ] ; 22 } 23 } 24 }

Efekt cache - násobení matic 5 4.5 4 3.5 GFLOPS 3 2.5 2 1.5 Baseline 1 Transposition Blocks 1 0.5 Blocks 2 Blocks 3 0 16 32 64 128 256 512 1024 2048 4096 Matrix size Obrázek : Klasický algoritmus pro násobení matic, algoritmus s transpozicí a blokový algoritmus na AMD Phenom 2 X6 1075T.

Efekt cache - násobení matic tento příklad nám dobře ukazuje, že pokud efektivně využíváme L1 cache, vyplatí se eliminovat i zdánlivé drobnosti na této úrovni už se vyplatí znát i assembler a sledovat kód generovaný překladačem Speed-up 24 22 20 18 16 14 12 10 8 6 4 2 0 16 32 64 128 256 512 1024 2048 4096 Matrix size Obrázek : Celkové urychlení optimalizace násobení matic na AMD Phenom 2 X6 1075T.

Efekt cache - násobení matic při operacích s maticemi je efektivní využití cache naprosto zásadní mnoho operací je efektivně implementováno v řadě numerických knihoven jako: Blas, Lapack, Atlas, PETSc, Intel MKL obecně lze vhodným přeuspořádáním for cyklů výrazně navýšit výkon aplikace ukážeme si ještě, jaké výsledky nám dají profilery testy byly provedeny na Intel Core i7 4600M 32 kb L1, 256 kb L2, 4MB L3

Efekt cache - násobení matic Efekt přepínače -g překladače gcc. size baseline blocks 3 with -g without -g with -g without -g 16 2.68e-6 2.69e-6 1.50e-6 1.52e-6 32 2.15e-5 2.16e-5 1.21e-5 1.21e-5 64 1.9e-4 1.91e-4 9.62e-5 9.68e-5 128 1.6e-3 1.68e-3 7.75e-4 7.75e-4 256 1.9e-2 1.88e-2 6.20e-3 6.19e-3 512 0.19 0.19 5.46e-2 5.43e-2 1024 3.66 3.40 0.58 0.57

Efekt cache - násobení matic Efekt přepínače odstranění optimalizací přepínačem -O3 překladače gcc. size baseline blocks 3 with -O3 without -O3 with -O3 without -O3 16 2.69e-6 1.55e-5 1.50e-6 1.26e-5 32 2.16e-5 1.15e-4 1.21e-5 9.54e-5 64 1.91e-4 9.46e-4 9.62e-5 7.64e-4 128 1.68e-3 8.22e-3 7.75e-4 6.07e-3 256 1.88e-2 7.76e-2 6.20e-3 4.86e-2 512 0.19 0.76 5.46e-2 0.40 1024 3.40 20.43 0.58 3.32

Efekt cache - násobení matic Naše měření ukazují následující výsledky (100% = běh všech pěti algoritmů): algorithm s -O3 bez -O3 baseline 37% 50% transposition 11% 9% blocks 1 21% 19% blocks 2 23% 11% blocks 3 6% 9%

Efekt cache - násobení matic Gprof s optimalizacemi -O3 1 Flat p r o f i l e : 2 3 Each sample counts as 0.01 seconds. 4 % cumulative s e l f s e l f t o t a l 5 time seconds seconds calls Ts / call Ts / call name 6 50.12 0.01 0.01 TimerRT : : s t a r t ( ) 7 50.12 0.02 0.01 TimerRT : : gettime ( ) 8 0.00 0.02 0.00 1 0.00 0.00 _GLOBAL sub_i Z16writeTableHeaderRSo 9 0.00 0.02 0.00 1 0.00 0.00 _GLOBAL sub_i_defaulttimer 10 0.00 0.02 0.00 1 0.00 0.00 TimerRT : : r e s e t ( ) bez optimalizací -O3 1 Flat p r o f i l e : 2 3 Each sample counts as 0.01 seconds. 4 % cumulative s e l f s e l f t o t a l 5 time seconds seconds calls us / call us / call name 6 32.27 21.00 21.00 76163 275.72 275.72 m u l t i p l y M a t r i c e s (... ) 7 21.62 35.07 14.07 53769 261.73 261.73 multiplymatricesblockwise1 <16>(... ) 8 16.47 45.79 10.72 88925 120.55 120.55 multiplymatricesblockwise2 <16>(... ) 9 14.89 55.48 9.69 79484 121.90 121.90 m u l t i p l y M a t r i c e s W i t h T r a n s p o s i t i o n (... ) 10 14.84 65.14 9.66 94538 102.17 102.17 multiplymatricesblockwise3 <16>(... ) 11 0.00 65.14 0.00 392984 0.00 0.00 TimerRT : : stop ( ) 12 0.00 65.14 0.00 392984 0.00 0.00 TimerRT : : s t a r t ( ) 13 0.00 65.14 0.00 392949 0.00 0.00 TimerRT : : gettime ( )

Efekt cache - násobení matic Oprofile s optimalizacemi -O3 1 CPU: I n t e l Haswell m i c r o a r c h i t e c t u r e, speed 2.901e+06 MHz ( estimated ) 2 Counted CPU_CLK_UNHALTED events ( Clock cycles when not h alted ) with a u n i t mask of 0x00 (No u n i t mask ) cou 3 samples % image name symbol name 4 1388122 99.2670 matrix m u l t i p l i c a t i o n main 5 4297 0.3073 [ vdso ] ( tgid :5205 range :0 x7fff393ba000 0x7fff393bbfff ) [ vdso ] ( tgid :5205 range :0 x7fff393b 6 1921 0.1374 no vmlinux / no vmlinux 7 1892 0.1353 libc 2.19. so memset 8 1035 0.0740 matrix m u l t i p l i c a t i o n TimerRT : : gettime ( ) 9 290 0.0207 libc 2.19. so _ int_free 10 258 0.0185 libc 2.19. so _ int_malloc 11 178 0.0127 libstdc ++.so.6.0.19 / usr / l i b / x86_64 linux gnu / libstdc ++.so.6.0.19 12 159 0.0114 libc 2.19. so memcmp_sse4_1 13 98 0.0070 libc 2.19. so malloc bez optimalizací -O3 1 CPU: I n t e l Haswell m i c r o a r c h i t e c t u r e, speed 2.901e+06 MHz ( estimated ) 2 Counted CPU_CLK_UNHALTED events ( Clock cycles when not h a l t e d ) w ith a u n i t mask of 0x00 (No u n i t mask ) cou 3 samples % image name symbol name 4 839355 34.9679 matrix m u l t i p l i c a t i o n m u l t i p l y M a t r i c e s (... ) 5 503906 20.9930 matrix m u l t i p l i c a t i o n multiplymatricesblockwise1 <16>(... ) 6 367684 15.3179 matrix m u l t i p l i c a t i o n multiplymatricesblockwise2 <16>(... ) 7 347259 14.4670 matrix m u l t i p l i c a t i o n m u l t i p l y M a t r i c e s W i t h T r a n s p o s i t i o n (... ) 8 337396 14.0561 matrix m u l t i p l i c a t i o n multiplymatricesblockwise3 <16>(... ) 9 2684 0.1118 no vmlinux / no vmlinux 10 806 0.0336 [ vdso ] ( tgid :5481 range :0 x7ffff09ec000 0x7ffff09edfff ) [ vdso ] ( tgid :5481 range :0 x7ffff09e 11 343 0.0143 libc 2.19. so memset 12 215 0.0090 matrix multiplication ArrayMatrix <float > : : setvalue ( float const&)

Efekt cache - násobení matic Callgrind s optimalizacemi -O3

Efekt cache - násobení matic Callgrind bez optimalizací -O3

Efekt cache - násobení matic Intel Vtune Amplifier s optimalizacema -O3

Efekt cache - násobení matic Intel Vtune Amplifier bez optimalizací -O3

Efekt cache - násobení matic Algorithm Code Gprof Oprofile Callgrind Vtune -O3 -O3 -O3 -O3 -O3 Baseline 37% 50% N/A 32% N/A 35% N/A 18% 23% 32% Transposition 11% 9% N/A 15% N/A 14% N/A 17% 19% 14% Blocks 1 21% 19% N/A 22% N/A 21% N/A 30% 19% 21% Blocks 2 23% 11% N/A 16% N/A 15% N/A 19% 20% 16% Blocks 3 6% 9% N/A 15% N/A 14% N/A 16% 17% 15% Vidíme, že: mnoho profilerů dává zcestné výsledky při zapnutí optimalizací překladače bez optimalizací běží výpočet pomaleji a neefektivita využití cache se tím pádem tolik neprojeví lepším nástrojem proto může být cachegrind valgrind -tool=cachegrind program args kcachegrind

Efekt cache - transpozice matic Příklad: Vrat me se ještě k transpozici matic. 1 void transpose ( ) 2 { 3 Real tmp ; 4 for ( i n t i = 1; i < size ; i ++ ) 5 for ( i n t j = 0; j < i ; j ++ ) 6 { 7 tmp = this >ma tr ix [ i size + j ] ; 8 this >ma tr ix [ i size + j ] = this >ma tr ix [ j size + i ] ; 9 this >ma tr ix [ j size + i ] = tmp ; 10 } 11 }

Efekt cache - transpozice matic testování tohoto kódu nám dá následující výsledky Rozměry Čas GFLOPS 15 2.08531e-07 0.539488 16 2.25712e-07 0.567095 17 2.4795e-07 0.58278 31 6.35805e-07 0.755735 32 6.31821e-07 0.810356 33 6.74428e-07 0.807351 63 2.12267e-06 0.934907 64 2.10355e-06 0.973594 65 2.19069e-06 0.964308 127 1.16852e-05 0.690145 128 2.4348e-05 0.336455 129 1.24456e-05 0.668552 255 6.00642e-05 0.541296 256 0.000143148 0.22891 257 6.09688e-05 0.541662 511 0.00040062 0.325897 512 0.00114895 0.11408 513 0.000374998 0.350893 1023 0.00478808 0.109285 1024 0.0103463 0.0506738 1025 0.00501621 0.104723 2047 0.0322302 0.0650045 2048 0.102728 0.0204147 2049 0.0362981 0.0578323

. CELYFLOUPECEK JEDEN.... ' #- F- i Efekt cache - transpozice matic TAG... #.,. He -0T #64 1 tales: : :.#i -8-64. : : f...... 4 0.. 48... 5. 6 CFEFEI, SLOUPEEKE MANCE CACHE ( CACHE LINE B fx DOUBLE PREC.) " " :*. = q III. iii. Iii 2 An - /Az - SE MAPUJE Do JEDNE CACHE SET PRT, PROCHAZEM POSCEANT FHORA DOLO V CACHE ZOSTAHOU POUZE DVA IADKY FCOUPEC SE MAPUIE ROVHONEENE DO VFECH CACHE SET.

Efekt cache - transpozice matic ukazuje se, že zvětšení rozměrů matice o jedna může zkrátit dobu výpočtu téměř na třetinu důvodem je mapování adres do cache důležitý je tzv. critical stride ten udává, po kolika bytech se budou data mapovat do stejné cache set pokud je rozměr matice roven násobku kritického kroku, budou se při procházení jednoho sloupce matice mapovat všechny prvky do omezeného počtu cache set a cache nebude využita efektivně řešením by opět bylo provést transpozici po blocích, čímž by se změnilo pořadí, ve kterém k prvkům matice přistupujeme tento příklad také ukazuje, že někdy se může vyplatit prokládat prvky polí prázdnými políčky, což zabrání zmíněnému efektu

Virtuální pamět a TLB aby mohl operační systém současně provozovat více aplikací/procesů, je nutné implementovat virtuální pamět každý proces pak vidí svůj vlastní adresový prostor a nemůže ovlivňovat ostatní procesy proces udává virtuální adresy ve svém a.p., které je pak nutné přeložit na fyzické adresy pamět se procesům přiděluje po stránkách o velikosti 4kB operační systém spravuje systém tabulek, které adresují jednotlivé stránky

Virtuální pamět a TLB

Virtuální pamět a TLB než operační systém zjistí skutečnou fyzickou adresu, musí prohledat několik tabulek to je velmi pomalé pro urychlení provádí samotný překlad přímo procesor navíc se používá speciální cache pro již přeložené adresy té se říká TLB - translation look-aside buffer jde o velmi malou cache o velikosti cca. 128 nebo 256 adress je velice rychlá, většinou fully associative dělí se na instrukční a datovou její obsah se zahazuje při každém přepnutí mezi různými procesy pokud chce jeden proces efektivně využít TLB, měl by pracovat s omezeným počtem pamět ových stránek

Virtuální pamět a TLB virtualizace výrazně znesnadňuje překlad adres a využití TLB vzniká ještě jedna vrstva, takže to co původně byla fyzická adresa je nyní jen adresa adresového prostoru daného OS a musí být přeložena ještě jednou běžný procesor na to není vybaven moderní procesory mají rozšíření jako Extended Page Tables Intel Nasted Page Tables AMD

Cache a TLB - programování v C/C++ přístup k lokálním proměnným může být rychlejší než ke globálním, protože jsou uloženy na zásobníku, jehož vrchol je velice pravděpodobně uložen v cache může se vyplatit udělat si lokální kopie globálních proměnných budou v paměti u sebe a překladač o nich má lepší přehled a pozná jestli je nutné je znovu načítat do registrů například při volání jiné funkce překladač musí po návratu počítat s tím, že globální proměnné se mohly změnit často používané složky objektů je dobré uvést jako první a mít je u sebe

Dynamická alokace paměti jde o velice náročnou operaci, kdy operační systém musí procházet systémové tabulky a najít vhodný volný blok paměti http://www.root.cz/clanky/jak-funguje-malloc-a-free u vícevláknových aplikací probíhá alokace sériové a může tak snížit efektivitu paralelizace častá dynamická alokace může vést k fragmentaci haldy pamětí přitom dnes není nutné šetřit může být výhodnější alokovat si veškerou pamět na začátku výpočtu, a pak dynamickou alokaci neprovádět vůbec lze také použít funkci alloca pro alokaci na zásobníku maximální velikost zásobníku bývá 8kB (ulimit -a)

Dynamická alokace paměti provedeme test následujících funkcí 1 i n t a [ 512 ] ; 2 3 void globalarraytest ( i n t pos ) 4 { 5 a [ pos 1 ] = 1; 6 } 7 8 void l o c a l A r r a y T e s t ( i n t pos ) 9 { 10 i n t b [ 512 ] ; 11 b [ pos 1 ] = 1; 12 } 13 14 void stacktest ( i n t pos ) 15 { 16 int c = ( int ) a l l o c a ( pos sizeof ( int ) ) ; 17 c [ pos 1 ] = 1; 18 } 19 20 void heaptest ( i n t pos ) 21 { 22 int c = ( int ) malloc ( pos sizeof ( int ) ) ; 23 c [ pos 1 ] = 1; 24 f r e e ( ( void ) c ) ; 25 } výsledek je 1 The g l o b a l array t e s t took : 14.657 CPU cycles. 2 The l o c a l array t e s t took : 13.986 CPU cycles. 3 The stack t e s t took : 50.682 CPU cycles. 4 The heap t e s t took : 178.054 CPU cycles.

Shrnutí Naše pozorování lze shrnout do následujících bodů: data by měla být v paměti uložena tak, aby se k nim přistupovalo sekvenčně a ne náhodně pokud to tak nejde, zkusíme výpočet rozdělit na menší bloky dat, které se vejdou do cache CPU data načtená do cache se snažíme využít co nejvíc