Jak optimalizovat výkon RAM. Optimalizujte nastavení virtuální paměti a mezipaměti. Které algoritmy jsou rychlejší?

Na mnoha stránkách počítačová témata Určitě tam budou odkazy na programy, které slibují, že jedním kliknutím zlepší výkon našeho počítače a stanou se starými pomalý počítač ve vysokorychlostní vesmírné lodi. že takové optimalizátory „na jedno kliknutí“ jsou přinejmenším k ničemu a k problematice optimalizace je potřeba přistupovat úplně jinak – promyšleněji a rozhodně ne nástrojem „na jedno kliknutí“. Existují také optimalizátory paměť s náhodným přístupem, které se v žebříčku zbytečných utilit řadí zvláště vysoko, protože nejenže nepřinášejí žádný užitek, ale také snižují rychlost vašeho počítače. A teď vysvětlím proč.

Na čem je založena obliba optimalizátorů paměti?

Popularita optimalizátorů paměti je založena na našem přesvědčení, že jsou malé volná paměť- Toto je velmi špatné. I když ve skutečnosti v tom není žádná tragédie, protože je to dobré! Může se to zdát divné, ale je to tak.

Co je to "volná paměť"?

Ve skutečnosti je volné paměti vždy málo... Koncepty se však za posledních pět až sedm let trochu změnily. Velká volná paměť nyní neznamená větší efektivitu systému, ale spíše menší. Moderní operační systémy totiž nechávají volné jen takové množství paměti, které může některá nově spuštěná aplikace nebo spuštěný program při svém provozu akutně vyžadovat. Všechno ostatní rezervovaná paměť systém utrácí spuštěné programy a služeb.

Co je mezipaměť?

Cache jsou data, která byla použita systémem nebo programy a která byla rezervována v RAM pro případ, že by byla znovu potřeba. Data se zálohují do paměti, protože rychlost čtení z RAM je mnohonásobně vyšší než rychlost čtení z pevného disku. V případě potřeby systém tato data znovu použije a výsledek bez prodlení zobrazí na obrazovce uživatele. Pokud by tato data byla pokaždé zálohována na pevný disk, pak by jejich rychlost načítání byla výrazně nižší, což by značně zpomalilo rychlost systému jako celku a vytvořilo zvýšené zatížení na pevných discích.

Jako analogii můžeme uvést příklad s cache prohlížeče, která je uložena na pevném disku počítače (grafika, styly, skripty, flash animace atd.). Načítání všech těchto dat z internetu pro každou jednotlivou stránku by bylo příliš plýtvání a zdlouhavé. Protože všechno moderní prohlížeče tato „těžká“ data si rezervují na pevný disk a načítají pouze hlavní obsah, což uživateli výrazně zrychluje zobrazování stránek. Při práci se používá podobný princip mezipaměť systému, který je uložen v paměti RAM pro rychlý přístup k datům.

Proto stojí za to změnit svůj pohled na paměť: v nových operačních systémech je pojem „volná paměť“ synonymem pro marné plýtvání zdroji. To je jen rezerva, aby to systém dal na chvíli další aplikaci, dokud se neuvolní zaneprázdněná paměť. Windows to uvolní sám požadované aplikací množství paměti RAM z dat mezipaměti nebo přenos dat z zřídka používaných programů do odkládacího souboru.

Všimněte si, že to všechno dělá operační systém nezávisle, bez pomoci jakýchkoli optimalizátorů. Proč jsou tedy takové „čističe paměti“ a „posilovače“ potřeba?

Jak fungují nástroje pro uvolnění paměti?

Existují pouze dva základní principy jejich práce:

  • Používají funkci EmptyWorkingSet from Windows API. Tato funkce vynutí vyprázdnění nepoužívaných dat z paměti do stránkovacího souboru na pevném disku počítače. Vizuálně se zvětší množství volné paměti ve správci úloh, ale poběží programy rychleji? rozhodně ne. Protože rychlost čtení z disku je mnohem nižší než rychlost čtení z RAM počítače.
  • Druhá metoda „čištění paměti“ spočívá v tom, že aplikace optimalizátoru vyžaduje od systému hodně paměti. Systém sám násilně uvolňuje paměť z mezipaměti a nevyužitých dat. Ale po deseti minutách Windows to pochopíže optimalizační program tuto paměť nepotřebuje a vrátí ji zpět do mezipaměti a dat jiných programů.

Co můžete udělat, abyste svému systému skutečně pomohli s optimalizací paměti?

Odpověď je jednoduchá – prostě nezasahujte do systému Windows a postupujte podle jednoduchých tipů.

  • Snažte se nespouštět příliš mnoho aplikací v nečinnosti. Jsou uživatelé, kteří po úpravě textu nezavřou Okno aplikace Word. A upravují spoustu dokumentů denně a všechny visí na pozadí a „zažírají“ paměť.
  • Odstranit zbytečné aplikace z počítače, zejména pokud se zablokují při spuštění.
  • Přidejte paměť fyzicky, pokud to váš počítač umožňuje. Náklady na RAM jsou nyní velmi dostupné a efekt zvýšení paměti uvidíte okamžitě!

Všechny „optimalizátory“ a „posilovače paměti“ třetích stran jsou minimálně k ničemu a maximálně zpomalí systém, což ukazuje na krátkodobé uvolnění malého množství RAM.

Zvýšený výkon mezipaměti

Vzorec pro průměrnou dobu přístupu do paměti v systémech s mezipamětí je následující:

Průměrná doba přístupu = doba zásahu + míra chyb x ztráta chyb

Tento vzorec jasně ukazuje způsoby optimalizace vyrovnávací paměti: snížení podílu chyb, snížení ztrát při chybách a zkrácení doby, kterou zabere přístup k vyrovnávací paměti při zásahu. Obrázek 5.38 shrnuje různé metody, které se v současnosti používají ke zvýšení výkonu mezipaměti. Použití určitých metod je určeno především účelem vývoje, zatímco konstruktéři moderní počítače ujistěte se, že systém je ve všech ohledech vyvážený.

Proč zvyšovat mezipaměť?

Primárním důvodem pro zvýšení velikosti mezipaměti na čipu může být to, že mezipaměť v moderních procesorech běží stejnou rychlostí jako samotný procesor. Frekvence procesoru v tomto případě není nižší než 3200 MHz. Větší mezipaměť umožňuje procesoru uchovávat větší části kódu připravené ke spuštění. Tato architektura procesoru je zaměřena na snížení latence spojené s nečinností procesoru čekáním na data. Moderní programy, včetně těch herních, využívají velké části kódu, které je nutné načíst ze systémové paměti na první žádost procesoru. Zkrácení času potřebného k přenosu dat z paměti do procesoru je spolehlivou metodou pro zvýšení výkonu aplikací náročných na paměť. L3 cache má trochu víc nejvyšší čas očekávání než L 1 a 2, to je zcela přirozené. Je sice pomalejší, ale stále výrazně rychlejší než normální paměť. Ne všechny aplikace těží z větší velikosti nebo rychlosti mezipaměti. To velmi závisí na povaze aplikace.

Pokud je velká mezipaměť na čipu dobrá věc, co tedy v minulosti bránilo Intelu a AMD od této strategie? Jednoduchá odpověď je vysoká cena takového řešení. Rezervace místa v mezipaměti je velmi drahá. Standardní 3,2 GHz Northwood obsahuje 55 milionů tranzistorů. Přidáním 2048 KB L3 cache Intel zvýší počet tranzistorů na 167 milionů. Jednoduchý matematický výpočet nám ukáže, že EE je jeden z nejdražších procesorů.

Provedena stránka AnandTech srovnávací testování dva systémy, z nichž každý obsahuje dva procesory - Intel Xeon 3,6 GHz v jednom případě a AMD Opteron 250 (2,4 GHz) v druhém. Testování bylo provedeno na aplikacích ColdFusion MX 6.1, PHP 4.3.9 a Microsoft .NET 1.1. Konfigurace vypadaly takto:

Dual Opteron 250;

2 GB DDR PC3200 (Kingston KRX3200AK2);

základní deska Tyan K8W;

Duální Xeon 3,6 GHz;

Mateřský deska Intel SE7520AF2;

OS Windows 2003 Web serveru Edice (32 bit);

1 tvrdé IDE 40 GB 7200 ot./min., 8 MB mezipaměti

Na aplikacích ColdFusion a PHP, které nejsou optimalizovány pro konkrétní architekturu, byly Opterony o něco rychlejší (2,5–3 %), ale test .NET prokázal konzistentní dodržování platforma Microsoft Intel, který umožnil dvojici Xeonů postoupit o 8 %. Závěr je zcela zřejmý: používat software Microsoftu pro webové aplikace má smysl volit procesory Intel, v ostatních případech několik nejlepší volba bude AMD.

Více není vždy lepší

Míru vynechání mezipaměti lze výrazně snížit zvýšením kapacity mezipaměti. Větší mezipaměť ale vyžaduje více energie, generuje více tepla a zvyšuje počet vadných čipů ve výrobě.

Jedním ze způsobů, jak tyto potíže obejít, je přenést logiku správy mezipaměti z Hardware na software.

"Kompilátor je potenciálně schopen analyzovat chování programu a generovat instrukce pro přenos dat mezi úrovněmi paměti," poznamenal Shen.

Podařilo se programově cache paměť nyní existuje pouze ve výzkumných laboratořích. Možné potíže jsou spojeny se skutečností, že kompilátory budou muset být přepsány a starší kód bude muset být překompilován pro všechny procesory nové generace.

Vzorec pro průměrnou dobu přístupu do paměti v systémech s mezipamětí je následující:

Průměrná doba přístupu = doba zásahu + míra chyb x ztráta chyb

Tento vzorec jasně ukazuje způsoby optimalizace vyrovnávací paměti: snížení podílu chyb, snížení ztrát při chybách a zkrácení doby, kterou zabere přístup k vyrovnávací paměti při zásahu. Níže na Obr. 7.3 stručně představuje různé techniky, které se v současnosti používají ke zlepšení výkonu mezipaměti. Použití určitých metod je dáno především účelem vývoje, přičemž konstruktéři moderních počítačů dbají na to, aby byl systém ve všech ohledech vyvážený.

Metoda Miss rate Ztráty při neúspěchu Doba obratu při zásahu Složitost hardwaru Poznámky
Zvětšení velikosti bloku + -
Zvyšování míry asociativnosti + - 1
Vyrovnávací paměť s pomocná cache +
Pseudoasociativní cache +
Hardwarové instrukce a přednačítání dat + 2 Předběžné načítání dat je obtížné
Předběžné načítání řízené kompilátorem + 3 Vyžaduje také nezamykatelnou mezipaměť
Speciální techniky pro snížení chyb + 0 Softwarová otázka
Upřednostnění vynechání čtení před zápisem + 1 Pouze pro jednoprocesorové systémy
Použití dílčích bloků ++ 1 Přepis + 1slovný podblok pomáhá zadání
Nejprve odešlete požadované slovo +
Neblokující cache +
Mezipaměti druhé úrovně + 2 Poměrně drahé vybavení
Jednoduché cache malá velikost - + 0
Obejít překlad adres během indexování mezipaměti + 2
Pipelining zapisuje pro rychlé zápisy + 1

Rýže. 7.3. Zobecnění metod optimalizace cache

Cache paměť (nebo jednoduše cache, z anglického Cache - sklad, úkryt) je určena k meziukládání informací ze systémové paměti za účelem urychlení přístupu k ní. Zrychlení je dosaženo použitím rychlejší paměti a rychlejším přístupem k ní. V tomto případě je v mezipaměti uložena neustále aktualizovaná kopie některé oblasti hlavní paměti.

Potřeba zavést mezipaměť je způsobena skutečností, že systémová paměť osobního počítače je spuštěna na mikroobvodech dynamická paměť, který se vyznačuje nižší cenou, ale také nižším výkonem ve srovnání se statickou pamětí. Myšlenka je, že zavedením rychlé vyrovnávací paměti, střední statická paměť Výměnu můžete urychlit pomocí pomalé dynamické paměti. Mezipaměť v podstatě dělá totéž, co dříve používané potrubí instrukcí, ale na pokročilejší úrovni. vysoká úroveň. Mezipaměť uchovává kopii určité části systémové paměti a procesor může s touto částí paměti komunikovat mnohem rychleji než se systémovou pamětí. Kromě toho lze příkazy i data ukládat do mezipaměti.



Výkonnostní výhoda při použití mezipaměti je způsobena skutečností, že procesor ve většině případů přistupuje k adresám paměti umístěným sekvenčně, jedna po druhé nebo blízko sebe. Je tedy vysoká pravděpodobnost, že informace z těchto adres paměti skončí uvnitř malé mezipaměti. Pokud procesor přistupuje na adresu umístěnou daleko od těch, ke kterým dříve přistupoval, cache se stane nepoužitelnou a vyžaduje restart, což může dokonce zpomalit přenos ve srovnání se strukturou bez cache.

V principu může být cache paměť buď interní (součást procesoru), nebo externí. Interní mezipaměť se nazývá mezipaměť první úrovně, externí mezipaměť se nazývá mezipaměť druhé úrovně. Vnitřní velikost mezipaměti je obvykle malá – typická hodnota 32 KB. Hlasitost externí mezipaměť může dosáhnout několika megabajtů. Jejich princip fungování je ale stejný.

Mezipaměť L1 procesoru 486 má čtyřkanálovou strukturu (obrázek 7.9). Každý kanál se skládá ze 128 řádků po 16 bytech. Stejnojmenné řádky ze všech čtyř kanálů tvoří 128 sad po čtyřech řádcích, z nichž každá obsluhuje svou vlastní paměťovou adresu. Každý řádek odpovídá 21bitové informaci o adrese do něj zkopírovaného bloku systémové paměti. Tato informace se nazývá štítek(Tag) řádky.

Rýže. 7.9. Struktura vnitřní mezipaměti procesoru 486.

Mezipaměť navíc obsahuje tzv. manažer, tedy paměťovou oblast s organizací 128 x 7, která ukládá 4bitové tagy platnosti pro každou ze 128 sad a 3bitové LRU (nejméně nedávno použité) kódy. pro každou ze 128 sad. Značka platnosti sady obsahuje 4 bity platnosti pro každý ze 4 řetězců obsažených v sadě. Bit spolehlivosti nastavený na jedničku indikuje, že odpovídající řádek je kompletní; pokud je resetován na nulu, pak je řetězec prázdný. Bity LRU udávají, jak dlouho bylo volání uskutečněno. tuto sadu. To je nezbytné pro aktualizaci nejméně používaných sad.

Vyrovnávací paměť je adresována pomocí 28 adresových bitů. Z nich nejméně významných 7 bitů vybere jednu ze 128 sad a nejvýznamnějších 21 bitů se porovná se značkami všech 4 řádků vybrané sady. Pokud se značky shodují s bity adresy, pak nastane situace přístupy do mezipaměti a pokud ne, tak situace cache miss.

V případě cyklu čtení přečte přístup do mezipaměti bajt nebo slovo z mezipaměti. Když dojde k chybě mezipaměti, jeden z řádků mezipaměti se aktualizuje (znovu načte).

V případě cyklu zápisu zapíše přístup do mezipaměti jak do mezipaměti, tak do hlavní paměti. systémové paměti. Chybějící mezipaměť zapisuje pouze do systémové paměti a neaktualizuje řádek mezipaměti. Tento řetězec se stane neplatným (jeho bit platnosti je vynulován).

Tato zásada nahrávání se nazývá přes nebo přímé nahrávání(Přepsat). Pozdější modely procesorů také používají odepsat(Write Back), což je rychlejší, protože vyžaduje mnohem méně volání externí sběrnice.

Použitím odepsat Zaznamenané informace jsou odeslány do hlavní paměti pouze tehdy požadovaný řádek není v mezipaměti. V případě zásahu se upraví pouze cache. Změněné informace vstoupí do hlavní paměti pouze po přepsání nový řádek uložit do mezipaměti. Předchozí řádek je zcela přepsán do hlavní paměti, čímž se obnoví identita obsahu mezipaměti a hlavní paměti.

V případě, že požadovaný řádek není v mezipaměti přítomen (situace s nedostatkem mezipaměti), je požadavek na zápis odeslán na externí sběrnici a požadavek na čtení je zpracováván poněkud komplexněji. Pokud tento požadavek patří do oblasti paměti v mezipaměti, provede se cyklus vyplnění celého řádku mezipaměti (16 bajtů z paměti se přepíše do jednoho z řádků sady obsluhující daná adresa). Pokud se požadované údaje nevejdou do jednoho řádku, vyplní se i sousední řádek. Procesor se snaží maximálně zaplnit řádek rychlým způsobem- však v dávkovém cyklu externí ovladač paměť může vyžadovat použití pomalejších přenosů.

Interní žádost Požadavek procesoru na data je uspokojen okamžitě, jakmile jsou data načtena z paměti a další plnění řádku může probíhat souběžně se zpracováním dat. Pokud je v sadě volný řádek, který obsluhuje danou adresu paměti, bude vyplněn. Pokud nejsou žádné volné linky, je vyplněna linka, která nebyla přístupná nejdelší dobu. K tomu se používají bity LRU, které se upravují při každém přístupu k řádku v dané sadě.

Navíc je možné zneplatnit řádky (prohlásit je za neplatné) a vymazat celou cache. V případě zápisu se mezipaměť vymaže pomocí speciálního externí signál procesor, programově využívající speciální týmy, stejně jako při prvotním resetu - signálem RESET. Se zpětným zápisem znamená vymazání mezipaměti také vyprázdnění všech upravených řádků do hlavní paměti.

Všimněte si, že v paměťovém prostoru osobního počítače jsou oblasti, pro které je ukládání do mezipaměti zásadně nepřijatelné (například sdílená paměť hardwarových adaptérů - rozšiřujících karet).

Režim přenos paketů (Burst Mode), poprvé představený v procesoru 486, je určen pro rychlé operace s linkami mezipaměti. Burst Cycle se liší tím, že pro předání celého paketu je adresa přenesena na externí adresovou sběrnici pouze jednou - na začátku paketu a pak v každém následujícím taktu jsou přenášena pouze data. Adresa pro každý následující datový kód je vypočítána z počáteční adresy podle pravidel stanovených jak datovým vysílačem, tak jeho přijímačem. Například adresa každého dalšího datového slova se vypočítá jako inkrementovaná adresa předchozího. V důsledku toho se výrazně zkrátí doba přenosu na slovo dat. Je zřejmé, že výměna cyklů paketů je možná pouze se zařízeními, která jsou zpočátku schopna takový cyklus obsluhovat. Povolená délka paketu není příliš dlouhá, např. při čtení je velikost paketu omezena na jeden řádek cache.

Režim násobení vnitřních hodin Procesor byl navržen s cílem zvýšit výkon procesoru, ale zároveň jej osadit do základních desek určených pro nízké takty. Například model procesoru 486DX2-66 pracuje v systémová deska s hodinovou frekvencí 33, ale vnitřně tuto frekvenci převádí na dvojnásobnou frekvenci - 66 MHz. To vám umožní snížit Celkové náklady systém, protože snižuje požadavky na prvky systémové desky.

Procesor 486 byl k dispozici ve 168- nebo 169-pinovém balení. Napájecí napětí - 5 V nebo 3,3 V. Zavedení sníženého napájecího napětí 3,3 V je spojeno s nutností snížit množství rozptýleného výkonu. Zvyšující se frekvence hodin a zvyšující se složitost struktur procesorů vedou k tomu, že výkon, který rozptylují, dosahuje několika wattů. Pro moderní procesory Na skříni procesoru je již nutné použít ventilátory.

Jak víte, počítač není televize a touha jej vylepšit vzniká již druhý den po koupi. První věc, která vás napadne, je optimalizace systému Windows. Naštěstí existuje spousta materiálů na toto téma jak na webu, tak na stránkách počítačových publikací. Ale stojí to za to takhle okamžitě zaútočit na systém a je to vždy možné získat pozitivní výsledek? Abych ušetřil nervové buňky a v některých případech i peníze běžných uživatelů PC, navrhuji porozumět některým problémům Operace Windows v detailech. Takže, začněme.

Nikdy, za žádných okolností, neprovádějte změny v registru resp systémové soubory Windows, aniž byste měli jeho záložní kopii. Existuje mnoho způsobů, jak zálohovat systém, jako např standardní prostředky Windows a používání speciální programy. Tato problematika byla na stránkách počítačového tisku opakovaně probírána a doufám, že každý čtenář již má potřebné zkušenosti v oblasti zálohování registrů. A pro ty, kteří si chtějí vytvořit svůj vlastní zálohovací program bez studia programovacích jazyků, doporučuji přečíst si článek, který podrobně popisuje tvorbu dávkové soubory pro zálohování a obnovu systému. To budeme předpokládat záložní kopie Už to máte a můžeme pokračovat ve výzkumu.

Optimalizace mezipaměti pevný disk.

Podle mnoha odborníků v oblasti operačního systému Windows by velikost mezipaměti měla být pevná a zcela závisí na množství paměti RAM nainstalované v počítači. Říká se, že Windows neumí pracovat s mezipamětí a utrácí na ní příliš mnoho RAM. Dokonce nabízejí standardní obvody k určení velikosti mezipaměti na základě velikosti paměti. To vše je zapsáno v sekci souboru system.ini ve tvaru MinFileCache = velikost v KB a MaxFileCache = velikost v KB. Tento přístup skutečně ušetří část paměti, ale může vést k celkovému zpomalení systému, zejména na domácích počítačích, kde mohou během dne běžet desítky zaneprázdněných úkolů. různé programy, multimediální i kancelářské a každý z nich vyžaduje různé velikosti cache a RAM. Je nepravděpodobné, že si před každým spuštěním užijete úpravy system.ini a restartování počítače nový program.

Univerzální velikost disková mezipaměť, podle mého názoru je tato možnost čistě teoretická, protože v některých případech bude stále přebytek mezipaměti a nedostatek paměti RAM, v jiných - naopak. A zítra syn přinese nějakou hru s nestandardním využitím paměťových prostředků a system.ini se bude muset znovu upravit? Moderní Verze Windows schopný spouštět programový kód přímo z mezipaměti, tzn. Mezipaměť již není mezičlánkem mezi pevným diskem a pamětí, ale není ničím jiným než součástí paměti RAM. Co se tedy snažíme omezit? Závěr: Omezení velikosti mezipaměti pevného disku ve většině případů vede ke snížení výkonu systému. Výjimkou jsou pouze počítače, které plní podobné úkoly, související především s přenosem velké objemy data. Zde vám optimalizace velikosti mezipaměti skutečně pomůže dosáhnout maximálního výkonu systému.

Virtuální paměť.

Většina rad v této věci vyšla najevo během vítězného tažení Windows 95, kdy si nové grafické rozhraní vyžádalo další a dost drahou RAM. Proč jsou tyto starověké rady taženy za svůj šedý vous na nové platformy? Moderní verze Windows totiž pracují s virtuální pamětí úplně jinak. Takže, co se nám nabízí dělat s odkládacím souborem? Ano, vše je stejné jako u starých oken, jmenovitě: udělejte jeho velikost pevnou a rovnou 3-4 velikostem RAM. Potřeba těchto akcí se obvykle vysvětluje tím, že OS tráví téměř věčnost změnou velikosti stránkovacího souboru, data se zbytečně fragmentují a tím zpomalují systém.

Předpokládám všeobecné rozhořčení, ale přesto se zavazuji tvrdit, že taková vysvětlení, pokud ne úplný nesmysl, pak přinejmenším dávno ztratila svůj význam. Mít zbavený Funkce Windows Určete si požadovanou velikost stránkovacího souboru sami, riskujete, že obdržíte zprávu o nemožnosti spuštění určitých programů. Riziko se zvyšuje, pokud se používá multitasking Windows. Například může snadno nastat situace, když potřebujete simultánní provoz s Photoshopem, textový procesor, HTML editor a nějaký další animátor. Kde je záruka, že v tuto chvíli nebudete muset otevírat grafický soubor o velikosti několika desítek MB pro následnou úpravu? Představte si, že by se v tuto chvíli systém zhroutil, protože Windows by nebyl schopen zvětšit velikost virtuální paměť, ale z nějakého důvodu jste výsledky své práce neuložili?! Už to není vtipné. Chtěl bych upozornit vážené čtenáře na další skutečnost. Windows mění velikost stránkovacího souboru dynamicky a hlavně když jsou systémové prostředky relativně volné a přístup na disk nezpůsobuje žádné nepříjemnosti.

Po dokončení aktuální úlohy zůstane velikost stránkovacího souboru po určitou dobu nezměněna. Pokud si v tuto dobu půjdete uvařit další šálek kávy, ani si nevšimnete žádných akcí ze strany OS, ale pokud chcete pokračovat v práci, je nepravděpodobné, že byste tyto 2,5 minuty nečinně seděli, ale spustili další program. Kromě toho požadavek na virtuální paměť pro moderní programy několikanásobně snížena díky použití tzv. principu přímého čtení (Linear Executable). Takové programy nejsou plně načteny do paměti, ale mapují svůj kód na paměťové stránky a podle potřeby načítají potřebné knihovny. To zajišťuje nejúplnější a optimální využití RAM i virtuální paměti. Je také sporné předpokládat, že fixace velikosti stránkovacího souboru zabrání zbytečné fragmentaci dat. Ostatně uvnitř samotného souboru budou data stále fragmentována, možná dokonce ve větší míře než s běžné použití. Co se týče přesunutí stránkovacího souboru na začátek disku nebo na samostatný fyzický disk, pak mají takové metody skutečně právo na život. Ale jen stěží si všimnete efektu tohoto.

K provádění takových činností budete potřebovat speciální drahé nástroje, jako je slavný balíček pana Nortona, který nevyhnutelně zapíše své programy do spuštění, čímž kompenzuje vylepšenou virtuální paměť úbytkem fyzické paměti. Abyste tomu zabránili, budete muset optimalizovat samotné utility. Práce s utilitami navíc vyžaduje alespoň základní pochopení toho, co se děje při jejich použití. Zvláště nebezpečné jsou automatizované funkce. Po použití jsem musel obnovit systémy více než jednou Norton Utilities. Důvod je směšně jednoduchý – nesprávné regionální nastavení. Faktem je, že Program Norton Disk Doctor, který je součástí nástrojů, přečte kód země. A pokud je na vašem počítači nainstalována ruská verze systému Windows a místní nastavení jsou, řekněme, USA, bude program považovat všechny názvy souborů a složek v ruském jazyce za chybu. Výsledek je myslím jasný. A to je jen malá část možné problémy. Závěr: Moderní verze Windows nepotřebují optimalizaci virtuální paměti. A pokud se přesto rozhodnete přesunout swapový soubor na začátek disku nebo na samostatný disk, pak si nezapomeňte prostudovat ceny za licencované utility + další HDD. Podle mého názoru bude řádka paměti stát mnohem méně.

Internet a modem.

Pokročilý Uživatelé Windows Doporučuje se přidat do klíče registru HKEY_LOCAL_MACHINE\ System\ CurrentControlSet\ Services\ Class\ NetTrans\ 0000 (možná 0001 atd.) některé parametry, které mají přímý vliv na výkon modemu. Hlavním parametrem je MaxMTU. Dovolte mi připomenout, že MTU (Maximum Transmition Unit) je maximální velikost paket dat, který lze přenášet po síti v jednom fyzickém rámci. Nejoptimálnější hodnota je MaxMTU=576. Ale promiňte, k čemu je optimální? Abych odpověděl na tuto otázku, navrhuji provést malý experiment. Využijme připojení k internetu pro hosty, které poskytuje jeden z nejoblíbenějších poskytovatelů v hlavním městě – Svit Online. Pro připojení ke vzdálenému počítači použijeme spíše zapomenutý Hyper program Terminál, vytáčené číslo 490-0-490, přihlášení - svit, heslo - online. A co uvidíme po zadání hesla?

Vzdálený počítač nám řekne přidělenou IP adresu a... MTU=1500! Nyní je vám jasné, proč je MaxMTU=576 optimální? Ne jinak než zpomalit přenos dat. Pro optimální přenos se ukazuje, že je třeba vycházet z hodnoty 1500. Nebudu se podrobně zdržovat výpočtem dalších parametrů, jako je MSS, TTL, jelikož všechna tato opatření považuji za zdaleka neškodná, přičemž zohlednit náklady na služby poskytovatele a minutovou platbu za pevnou linku. Windows odvádí skvělou práci automatická detekce Samotné MTU, bez našeho zásahu. Je lepší zaměřit svou pozornost na zkvalitnění komunikační linky alespoň v rámci vlastního bytu. Častěji jsou příčinou zhoršení komunikace různé druhy zvratů, špatné kontakty a mnoho paralel telefonní přístroje, ne hardwarové a soft. Ale to je téma na jinou diskusi.

Windows Me také postihla optimalizace. Co zde nenabízejí: odebrat PC Health, deaktivovat Obnovení systému a zbavit se Přehrávač médií 7 s Movie Makerem a nahraďte IE 5.5 více stará verze a dokonce zadat skutečné režim DOS. A to vše jen pro instalaci nového operačního systému na PC s Pentiem 133 MHz a 32 MB RAM. Ale co z toho pak zůstane? O jaké platformě Windows Me mluvíme? Koneckonců, i když se vám podaří umístit motor Mercedesu do Záporoží, nestane se z něj Mesredes. Výsledkem jsou další poruchy, nepříjemnosti v práci a častěji - formát C:. Zde uživatel uvěří příběhům o legendárních závadách systému Windows. Přesněji řečeno, nebude tomu věřit, ale ověří si to z vlastní hořké zkušenosti.

Sdílení toho, co máme, se svými bližními je pro nás, Boží stvoření, velmi typické, je považováno za ctnost a obecně, jak se uvádí, má pozitivní vliv na karmu. Ve světě vytvořeném architekty mikroprocesorů však toto chování vždy nevyústí dobré výsledky, zejména pokud jde o sdílení paměti mezi vlákny.

Všichni jsme něco málo o optimalizaci paměti četli a zjistili jsme, že je užitečná, když je mezipaměť stále horká, což znamená, že data, ke kterým často přistupují vlákna, by měla být kompaktní a v mezipaměti nejblíže jádru procesoru. To je pravda, ale pokud jde o sdílení přístupu, vlákna se stávají nejhoršími nepřáteli [výkonu] a mezipaměť není jen horká, ale již „hoří pekelným ohněm“ – taková bitva se kolem ní odehrává.

Níže se podíváme na jednoduchý, ale ilustrativní případ problémů s výkonem vícevláknového programu a poté uvedu několik obecná doporučení, jak se vyhnout problému ztráty výpočetní efektivity v důsledku sdílení mezipaměti mezi vlákny.

Uvažujme případ, který je dobře popsán v Intel64 a IA-32 Architectures Optimization Manual, ale na který programátoři často zapomínají při práci s poli struktur ve vícevláknovém režimu. Umožňují tokům přístup (s modifikací) k datům ze struktur umístěných velmi blízko sebe, a to v bloku, rovná délce jeden řádek mezipaměti (64 bajtů). Říkáme tomu Сache sdílení linky. Existují dva typy rozdělení řádků mezipaměti: skutečné sdílení A falešné sdílení.
Opravdové sdílení(skutečné sdílení) je, když vlákna mají přístup ke stejnému paměťovému objektu, jako je sdílená proměnná nebo synchronizační primitivum. Falešné sdílení(od toho zlého) - jedná se o přístup k různým datům, ale z nějakého důvodu končí na stejné lince mezipaměti procesoru. Okamžitě poznamenejme, že oba případy poškozují výkon kvůli potřebě hardwarové synchronizace mezipaměti procesoru, ale pokud je první případ často nevyhnutelný, druhý může a měl by být vyloučen.

Vysvětleme na příkladu, proč produktivita trpí. Řekněme, že zpracováváme sekvenci datových struktur zařazených do fronty vícevláknovým způsobem. Aktivní vlákna jedno po druhém vyjmou další strukturu z fronty a nějakým způsobem ji zpracují, přičemž upraví data. Co se může stát hardwarová úroveň, pokud je například velikost této struktury malá a nepřesahuje několik desítek bajtů?


Podmínky pro vznik problému:
Dvě nebo více vláken zapisuje do stejného řádku mezipaměti;
Jedno vlákno zapisuje, zbytek čte z řádku mezipaměti;
Jedno vlákno zapisuje, ale v ostatních jádrech pracuje HW prefetcher.

Může se ukázat, že proměnné v polích různých struktur jsou v paměti umístěny tak, že při čtení do L1 cache procesoru jsou umístěny ve stejném cache řádku, jako na obrázku. Navíc, pokud jedno z vláken upraví pole své struktury, pak je celý řádek mezipaměti v souladu s protokolem koherence mezipaměti prohlášen za neplatný pro zbývající procesorová jádra. Jiné vlákno již nebude moci používat jeho strukturu, přestože je již v mezipaměti L1 jeho jádra. U starších procesorů typu P4 by taková situace vyžadovala dlouhou synchronizaci s hlavní pamětí, to znamená, že by upravená data byla odeslána do hlavní paměti a následně načtena do L1 cache jiného jádra. V současné generaci procesorů (kódové označení Sandy Bridge) synchronizační mechanismus využívá společnou mezipaměť třetí úrovně (nebo LLC - Last Level Cache), která je součástí subsystému mezipaměti a ve které jsou umístěna všechna data umístěná v L2 i L1 všech procesorových jader. K synchronizaci tedy nedochází s hlavní pamětí, ale s LLC, která je součástí implementace protokolu mechanismu koherence mezipaměti, která je mnohem rychlejší. Ale stále se to děje a vyžaduje to čas, i když se měří pouze v několika desítkách cyklů procesoru. Co když jsou data v řádku mezipaměti sdílena mezi vlákny běžícími na různých fyzických procesorech? Pak budete muset synchronizovat mezi LLC různé čipy, a to bude trvat mnohem déle - stovky hodinových cyklů. Nyní si představme, že program pouze zpracovává ve smyčce proud dat přijatých z nějakého zdroje. Ztrátou stovek hodinových cyklů při každé iteraci smyčky riskujeme výrazné snížení naší produktivity.

Podívejme se na následující příklad, který byl zjednodušen, aby bylo snazší problém pochopit. Nepochybuj o tom skutečné aplikace ke stejným případům dochází velmi často a na rozdíl od rafinovaného příkladu není ani odhalení existence problému tak snadné. Níže vám ukážeme, jak rychle najít tyto situace pomocí Performance Profiler.

Funkce vlákna prochází dvěma plovoucími poli a[i] a b[i], násobí jejich hodnoty indexem pole a přidává je k místním proměnným vlákna localSum. Pro zvýšení efektu se tato operace provádí několikrát (ITERACE).

< ITERATIONS; j++){ for (i = tid; i < MAXSIZE; i+= NUM_PROCS){ a[i] = i + a[i] * b[i]; localSum += a[i];}} }

Problém je v tom, že metodou zvolenou pro rozdělení dat mezi vlákna je prokládání indexů smyček. To znamená, že pokud máme spuštěna dvě vlákna, první bude přistupovat k prvkům polí a a b, druhé bude přistupovat k prvkům a a b, první bude přistupovat k a a b, druhé bude přistupovat k a a b atd. na. V tomto případě jsou prvky pole a[i] modifikovány vlákny. Není těžké vidět, že 16 prvků pole bude spadat do jednoho řádku mezipaměti a vlákna budou současně přistupovat k sousedním prvkům, což „zblázní“ mechanismus synchronizace mezipaměti procesoru.

Nejnepříjemnější je, že při běhu programu si existenci tohoto problému ani nevšimneme. Bude to fungovat pomaleji, než může, to je vše. Jak vyhodnotit efektivitu programu pomocí profileru VTune Amplifier XE jsem již popsal v jednom z příspěvků na Habré. Pomocí profilu Obecný průzkum, který jsem tam zmínil, vidíte popsaný problém, který nástroj „zvýrazní“ ve výsledcích profilování ve sloupci Napadený přístup. Tato metrika přesně měří poměr cyklů strávených synchronizací mezipaměti procesoru, když jsou upraveny vlákny.

Pokud by někoho zajímalo, co se za touto metrikou skrývá, tak při komplexním profilování nástroj sbírá data čítačů mezi ostatními hardwarovými čítači:
MEM_LOAD_UOPS_LLC_HIT_RETIRED.XSNP_HITM_PS– Přesný čítač (PS) dokončené (RETIRED) operace (OUPS) načítání (LOAD) dat (MEM), která skončila (HIT) v LLC a modifikovala (M). „Přesný“ čítač znamená, že data shromážděná takovým čítačem ve vzorku jsou relativní k instrukčnímu ukazateli (IP) po instrukci, která byla právě tím zatížením, které způsobilo synchronizaci mezipaměti. Zadáním statistiky této metriky můžeme s určitou přesností označit adresu instrukce, a tedy i řádek zdrojový kód kde se čtení odehrávalo. VTune Amplifier XE dokáže ukázat, která vlákna čtou tato data, a pak musíme sami přijít na to, jak je implementován vícevláknový přístup k datům a jak situaci napravit.

Ohledně našeho jednoduchý příklad situaci lze velmi snadno napravit. Stačí rozdělit data do bloků a počet bloků se bude rovnat počtu vláken. Někdo by mohl namítnout, že pokud jsou pole dostatečně velká, pak se bloky do mezipaměti jednoduše nevejdou a data načtená z paměti pro každé vlákno se budou navzájem vytlačovat z mezipaměti. To bude platit, pokud jsou všechna data bloku používána neustále, a ne pouze jednou. Například při násobení matic budeme procházet prvky dvourozměrné pole nejprve po řádcích, poté po sloupcích. A pokud se obě matice nevejdou do mezipaměti (na jakékoli úrovni), pak budou vyřazeny a opakovaný přístup k prvkům bude vyžadovat opětovné načtení z další úrovně, což negativně ovlivňuje výkon. V obecném případě s maticemi se používá modifikované násobení matic blok po bloku, kdy jsou matice rozděleny do bloků, které jsou samozřejmě umístěny v dané cache paměti, což výrazně zvyšuje výkon algoritmu.

Int work(void *pArg) ( int j = 0, i = 0; int tid = (int) pArg; for (j = 0; j< ITERATIONS; j++){ chunks = MAXSIZE / NUM_PROCS; for (i = tid * chunks; i < (tid + 1) * chunks; i++){ a[i] = i + a[i] * b[i]; localSum += a[i];}} }

Falešné sdílení

Žádné falešné sdílení

Porovnání přístupu vlákna k prvkům pole v případě False sdílení a v opraveném kódu

V našem jednoduchém případě se data použijí pouze jednou a i když budou z cache vyklizena, už je nebudeme potřebovat. A hardwarový prefetcher, mechanismus pro odkládání dat z hlavní paměti implementovaný v procesoru, zajistí, že data obou polí a[i] a b[i], umístěných daleko od sebe v adresovém prostoru, budou v mezipaměti. včas. Funguje to dobře, pokud se k prvkům pole přistupuje postupně.

Na závěr můžeme uvést několik obecných doporučení, jak se vyhnout problému ztráty výpočetní efektivity v důsledku sdílení mezipaměti mezi vlákny. Už ze samotného názvu problému můžete pochopit, že byste se měli vyhnout kódování tam, kde vlákna velmi často přistupují ke sdíleným datům. Pokud se jedná o skutečné sdílení mutexu vlákny, pak je možná problém s nadměrnou synchronizací a přístup ke sdílení prostředku, který je chráněn tímto mutexem, by měl být přehodnocen. Obecně se snažte vyhnout globálním a statickým proměnným, ke kterým je potřeba přistupovat z vláken. Použijte lokální proměnné vlákna.

Pokud pracujete s datovými strukturami ve vícevláknovém režimu, věnujte pozornost jejich velikosti. Pomocí odsazení zvětšete velikost struktury na 64 bajtů:
struct data_packet ( int adresa; int data; int atribut; int padding; )
Přidělte paměť pro struktury na zarovnaných adresách:
__declspec(align(64)) struct data_packet sendpack
Používejte maticové struktury místo maticových struktur:
data_packet sendpack;
namísto
struct data_packet ( int adresa; int data; int atribut; )
Jak můžete vidět, v druhém případě vlákna upravující jedno z polí spustí mechanismus synchronizace mezipaměti.

Pro objekty alokované v dynamické paměti pomocí malloc nebo new vytvořte místní paměťové oblasti pro vlákna nebo použijte paralelní knihovny, které to dokážou samy. Například knihovna TBB obsahuje škálovatelné a vyrovnávací alokátory, které jsou užitečné pro škálovatelnost vícevláknových programů.

No, závěrečná rada: nespěchejte s řešením problému, pokud to příliš neovlivní celkový výkon aplikací. Vždy vyhodnoťte potenciální zisk, který získáte z nákladů na optimalizaci kódu. K vyhodnocení tohoto zisku použijte nástroje pro profilování.

P.S. Vyzkoušejte můj příklad a řekněte mi, o kolik procent se výkon testu na vaší platformě zvýšil.

Štítky: Přidat štítky




Horní