====== 13. Víceúrovňový model počítače, virtualizace ======
{{courses:B35APO:lectures:13:a0b36apo_prednaska13-virt-overall.pdf|}}
{{courses:B35APO:lectures:13:a0b36apo_prednaska13-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}}