Warning
This page is located in archive.

13. Víceúrovňový model počítače, virtualizace

Odkazy

Proč je potřeba znát i nižší úrovně systému, než na které je vlastní (placený) projekt implementovaný.

Randall Hyde: The Write Great Code Series

Agner Fog: Software optimization resources

Free-Electrons: Embedded Linux, kernel ad real-time presentations (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 valgrind a zobrazené programem kcachegrind při kompilaci pro paltformu x86_64 GNU/Linux a statickém linkování proti GLibC.

Program k otestování je v archivu 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

Concat 16-bit - snpritf

Concat 16-bit - sll

courses/b35apo/lectures/13/start.txt · Last modified: 2018/02/11 17:30 (external edit)