Programování v asembleru - multiprocesory Jakub Yaghob
Programování na MP Problémy Atomické operace Zaručené atomické operace Zamykání sběrnice Cache Pořadí paměťových operací Serializující instrukce Samomodifikující se kód Spin-locky
Zaručené atomické operace i486+ R/W byte R/W word zarovnané na word R/W dword zarovnané na dword Pentium+ R/W qword zarovnané na qword R/W word z/do necachované paměti v rámci 32-bitové sběrnice Pentium Pro+ Nezarovnaný R/W word, dword, qword z/do jedné řádky cache
Zamykání sběrnice Automatické Instrukce XCHG s pamětí Pomocí prefixu LOCK Pouze pro povolené instrukce, jinak #UD BTS, BTC, BTR XADD, CMPXCHG, CMPXCHG8B INC, DEC, NOT, NEG, ADD, ADC, SUB, SBB, AND, OR, XOR
Terminologie cache Cache line fill R z cacheovatelné paměti R celé řádky cache Cache hit Adresa je v cache Cache miss Adresa není v cache Write hit Pokud je adresa v cache, jde zápis do cache Jinak je proveden cache line fill
Koherence cache MESI protokol Každá řádka cache má 2 bity na stav „Transparentní“ pro software Instrukční L1 má pouze SI stavy Přechody snoopingem CPU detekuje na sběrnici W do řádky s M Zruší transakci Přímý přepis řádky cache do druhého CPU s odbočkou do paměti Přepnutí do stavu I Stav řádky cacheM (Modified)E (Exclusive)S (Shared)I (Invalid) Je platná?ano ne Kopie v paměti je......stará...přesná N/A Kopie na jiných CPU?ne možná W do této řádky......nejde na sběrnici... Nejde na sběrnici, přesun do M...přesun do E...jde přímo do paměti
Pořadí paměťových operací Pořadí podle programu (silné pořadí) R/W na sběrnici ve stejném pořadí, v jakém se vyskytují v proudu instrukcí i386 Pořadí podle procesoru (slabé/spekulativní pořadí) Přesné chování záleží na modelu CPU Pentium Pro+ Pentium a i486 Většinou se chovají v pořadí podle programu R miss může předběhnout W, když jsou všechny nabufferované W cache hity I/O vždy v pořadí podle programu
Pořadí podle procesoru na WB paměti Jeden CPU R může být prováděn spekulativně v jakémkoliv pořadí R může předběhnout W, ale CPU se musí chovat konzistentně W do paměti jsou prováděny vždy v pořadí podle programu, kromě instrukcí CLFLUSH, MOVNTI, MOVNTQ, MOVNTDQ, MOVNTPS, MOVNTPD W mohou být bufferovány W nejsou spekulativní, provádí se pouze pro instrukce, které byly skutečně provedeny Data z bufferovaných W mohou být podstrčeny čekajícím R uvnitř CPU R/W nemohou předběhnout I/O, zamčené a serializující instrukce R nemůže předběhnout LFENCE a MFENCE W musí být proveden před SFENCE nebo MFENCE Více CPU Jednotlivé CPU se chovají samostatně jako jeden CPU W z jednoho CPU jsou pozorovány ve stejném pořadí všemi CPU W z jednotlivých CPU na sběrnici NEJSOU seřazeny vůči sobě
Pořadí podle procesoru
Serializující instrukce CPU dokončí všechny změny příznaků, registrů a paměti CPU vyčistí všechny bufferované W Pentium+ Některé privilegované instrukce Neprivilegované instrukce CPUID, IRET, RSM Neprivilegované pro zesílení pořadí paměťových operací LFENCE, SFENCE, MFENCE
Samomodifikující se kód Možnost 1 Zapsat modifikovaný kód pomocí datového segmentu Skok na modifikovaný kód nebo na mezilehlou adresu Vykonávání změněného kódu Možnost 2 Zapsat modifikovaný kód pomocí datového segmentu Provést serializující instrukci Vykonávání změněného kódu Velká výkonnostní ztráta Cross-modifikující kód Jeden CPU změní kód a druhý ho chce vykonat Sesynchronizovat CPU a vykonat serializující instrukci
Spin-locky Využití instrukce PAUSE Kódována jako REP NOP, potíže na starších AMD spin_lock: cmplockvar,0 jeget_lock pause jmpspin_lock get_lock: moveax,1 xchg eax,lockvar testeax,eax jnespin_lock spin_lock_end: movlockvar,0