====== 13. Víceúrovňový model počítače, virtualizace ====== {{.:lekce13-vmlev-virt.pdf|PDF}} [[https://gitlab.fel.cvut.cz/b35apo/apo-slides/-/tree/main/13-vmlev-virt|TeX]] === Další materiály === {{..:..:en:lectures:13:b35apo_lecture13-virt-overall.pdf|}} {{..:..:en:lectures:13:b35apo_lecture13-virt-overall.odp|}} ===== Odkazy ===== Proč je potřeba znát i nižší úrovně systému, než na které je vlastní (placený) projekt implementovaný. /* Randall Hyde: [[http://www.writegreatcode.com/|The Write Great Code Series]] */ Randall Hyde: [[http://www.plantation-productions.com/Webster/www.writegreatcode.com/|The Write Great Code Series]] Agner Fog: [[http://www.agner.org/optimize/|Software optimization resources]] Free-Electrons: [[http://free-electrons.com/docs/|Embedded Linux, kernel ad real-time presentations]] ([[http://free-electrons.com/doc/legacy/virtualization/|virtualizace]] a množství dalších kvalitních informací) ===== Příklad, jak lze bez znalosti implementace také navrhnout "správné" řešení ===== Při hledání PCI karty jsou načtena binárně data hlaviček PCI zařízení. První dvě dvojice byte identifikují výrobce a typ zařízení. Dva po sobě následující byte je tedy potřeba převést na 16-bit hodnotu a tu porovnat. Zde jsou dvě řešení: První, kdy kód píše někdo na základě chytré úvahy nad kombinováním možností funkcí, ale bez představy o tom, jak jsou data v paměti uložena a jaká je náročnost převodů mezi různými formáty (text/binarní číslo) int concat16(int h, int l) { char s[20]; snprintf(s,sizeof(s)-1,"%02x%02x",h,l); s[sizeof(s)-1] = 0; return strtol(s,NULL,16); } Druhé řešení, které sice neumožňuje předvést své kombinatorické schopnosti, ale vychází ze znalosti vlastností aritmetiky ve dvojkové soustavě, je 100x až 1000x rychlejší. int concat16(int h, int l) { return (h<<8)|l; } To druhé vypadá v kódu našeho modelovévo CPU (MIPS) takto concat16: sll v0,a0,0x8 jr ra or v0,a1,v0 Na následujících obrázcích jsou znázorněné průběhy volání obou řešení analyzované programem [[http://valgrind.org/|valgrind]] a zobrazené programem [[http://kcachegrind.sourceforge.net/html/Home.html|kcachegrind]] při kompilaci pro paltformu x86_64 GNU/Linux a statickém linkování proti GLibC. Program k otestování je v archivu {{courses:B35APO:lectures:13:right-vs-effective.tar.gz|}}. K otestování je potřeba valgrid - neocenitelný nástroj pro hledání chyb v práci s pamětí a analýzu efektivního využití CACHE. Kompilace a zpuštění testu make clean all val kcachegrind {{courses:B35APO:lectures:13:effectivity-example-1-snprintf.png|Concat 16-bit - snpritf}} {{courses:B35APO:lectures:13:effectivity-example-1-sll.png|Concat 16-bit - sll}}