1 / 65

Programování v asembleru – FPU a spol.

Programování v asembleru – FPU a spol. Jakub Yaghob. Ještě jednou historie – FPU. FPU F loating P oint U nit Formát dat i výpočet odpovídá IEEE 754 Koprocesor Nejprve samostatný čip 8086+8087, 80186+80187, 80286+80287, 80386+80387 Integrovaný na čipu s hlavním procesorem

roger
Download Presentation

Programování v asembleru – FPU a spol.

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programování v asembleru – FPU a spol. Jakub Yaghob

  2. Ještě jednou historie – FPU • FPU • Floating Point Unit • Formát dat i výpočet odpovídá IEEE 754 • Koprocesor • Nejprve samostatný čip • 8086+8087, 80186+80187, 80286+80287, 80386+80387 • Integrovaný na čipu s hlavním procesorem • i486, Pentium, Pentium Pro, Pentium II, Pentium III, Pentium IV • Výpočet probíhá paralelně s výpočtem hlavního procesoru

  3. Ještě jednou historie – MMX • MMX • První pokus o SIMD na IA-32 • Prvně implementováno v procesorech Pentium MMX a Pentium II • Pouze celočíselné operace • Vzájemně se vylučuje s FPU • Používá registry FPU • AMD odpovědělo technologií 3DNow

  4. Ještě jednou historie – SSE • SSE • Streaming SIMD extensions • Implementováno poměrně pozdě • Pentium III • Vlastní nové registry • XMM, MXCSR • Operace SIMD ve „float“ přesnosti • Instrukce pro řízení cache, prefetch

  5. Ještě jednou historie – SSE2 • SSE2 • Pentium IV • Používá registry z SSE • Operace SIMD v „double“ přesnosti • 128-bitové operace SIMD na celých číslech • Instrukce pro řízení cache, pořadí paměťových operací

  6. Ještě jednou historie – SSE3 • SSE3 • Nová generace procesoru Pentium IV (Prescott) a procesory Core • Další rozšíření SSE2 • Další SIMD operace • „Horizontální“ SIMD operace • Monitor

  7. Ještě jednou historie – SSE4 • SSE4 • Rozděleno na dvě rozšíření SSE4.1 a SSE4.2 • SSE4.1 • 45nm Core 2 • 47 nových instrukcí • Zlepšení výkonu pro zpracování médií, 3D • SSE4.2 • Core i7 • 7 nových instrukcí • Zpracování řetězců, aplikační instrukce

  8. Ještě jednou historie – AVX • AVX • Advanced Vector eXtensions • Rozšíření SSE registrů na 256 bitů • 3-operandový zápis instrukcí • ADDPS xmm1,xmm2/m128 • VADDPS xmm1,xmm2,xmm3/m128 • Většina instrukcí bez omezení na zarovnání • Prefix instrukce VEX

  9. Výpočetní prostředí FPU I.

  10. Výpočetní prostředí FPU II. • Datové registry • Zásobník • Výpočet v obrácené polské notaci

  11. Výpočetní prostředí FPU III. • Stavový registr • Pouze pro čtení • Podmínkové příznaky se chovají u různých instrukcí různě • ES nastaveno, kdykoliv nějaké xE nastaveno • Při SF rozhoduje C1=1 (overflow), C1=0 (underflow)

  12. Výpočetní prostředí FPU IV. • Řídící registr • Maska výjimek • Řízení přesnosti • Ovlivňuje pouze operace +,-,*,/, sqrt • Řízení zaokrouhlování

  13. Výpočetní prostředí FPU V. • Značkovací registr • Vázáno na fyzické registry

  14. Datové typy FPU I. • Numerické typy • Odpovídají IEEE 754 • 32- a 64-bitová čísla mají implicitní celou část mantisy = 1 • Hodnota = -1Sign* Mantisa * 2Exponent-Posun exponentu

  15. Datové typy FPU II. • Celočíselné typy

  16. Datové typy FPU III. • Nekonečno • Numerické • Celočíselné = 10...0 • Další typy hodnot • NaN (Not aNumber) • Quiet • Signaling • Nenormalizované číslo

  17. Float FLD mem FLD ST(i) FST, FSTP mem FST, FSTP ST(i) FXCH ST(i) FCMOVcc ST(0),ST(i) Integer FILD mem FIST, FISTP mem BCD FBLD mem FBSTP mem Instrukce FPU – přesuny

  18. Load +0.0 FLDZ Load +1.0 FLD1 Load π FLDPI Load log2 10 FLDL2T Load log2 e FLDL2E log10 2 FLDLG2 loge 2 FLDLN2 Instrukce FPU – konstanty

  19. Sčítání FADD mem FADD ST(0),ST(i) FADD ST(i),ST(0) FADDP ST(i),ST(0) FIADD mem Odčítání FSUB/FSUBP FSUBR/FSUBRP FISUB/FISUBR Násobení FMUL/FMULP FIMUL Dělení FDIV/FDIVP FDIVR/FDIVRP FIDIV/FIDIVR Ostatní FABS FCHS FSQRT FPREM, FPREM1 FRNDINT FXTRACT Instrukce FPU – aritmetika

  20. Float FCOM/FCOMP mem FCOM/FCOMP ST(i) FCOMPP Float neuspořádané FUCOM/FUCOMP FUCOMPP Integer FICOM/FICOMP mem Přímé float FCOMI/FCOMIP Přímé float neuspořádané FUCOMI/FUCOMIP Ostatní FTST FXAM Instrukce FPU – porovnání

  21. sin FSIN cos FCOS sin a cos FSINCOS tg FPTAN arctg FPATAN Instrukce FPU – trigonometrické

  22. Logaritmus y * log2 x FYL2X Logaritmus y * log2 x+1 FYL2XP1 Exponent 2x-1 F2XM1 Násobení mocninou 2 FSCALE Instrukce FPU – logaritmické a exponenciální

  23. Inicializace FINIT/FNINIT Řídící slovo FLDCW FSTCW/FNSTCW Stavové slovo FSTSW/FNSTSW Výjimky FCLEX/FNCLEX Ukazatel zásobníku FINCSTP/FDECSTP Prostředí FLDENV FSTENV/FNSTENV Stav FRSTOR FSAVE/FNSAVE Ostatní FFREE FNOP WAIT/FWAIT Instrukce FPU – řídící

  24. Porovnání ve FPU – I • Tradiční metoda

  25. Porovnání ve FPU – II • Novější metoda • Od Pentia Pro • Porovnávací instrukce přímo nastavují odpovídající příznaky v EFLAGS jako bezznaménkové porovnání • Instrukce pro porovnání: FCOMI, FCOMIP, FUCOMI, FUCOMIP • Instrukce pro podmíněný přesun: FCMOVcc ST(0),ST(i)

  26. Porovnání ve FPU – III • Unordered porovnání • Aspoň jeden NaN • Nastavení příznaků

  27. Hlášení výjimek FPU • FPU pracuje paralelně s hlavním proudem instrukcí • Kdy se má vyvolat výjímka pro FPU v hlavním proudu? • Na další FPU instrukci • WAIT/FWAIT • Problém s ukládáním dat FPU: kdy je uvidím v hlavním proudu? • Od i486 není třeba • WAIT/FWAIT

  28. Výpočetní prostředí MMX • Registry jsou sdíleny s FPU • Mantisová část registrů

  29. Datové typy MMX

  30. SIMD model

  31. Modely aritmetiky MMX • Wraparound • „Normální“ aritmetika, která nekontroluje žádné přetečení • Znaménková saturace • Při přetečení/podtečení přes znaménkové maximum/minimum je výsledkem znaménkové maximum/minimum • Bezznaménková saturace • Při přetečení/podtečení přes bezznaménkové maximum/minimum je výsledkem bezznaménkové maximum/minimum

  32. 32-bitů MOVD mem,mmxr MOVD mmxr,mem MOVD r,mmxr MOVD mmxr,r 64-bitů MOVQ mem,mmxr MOVQ mmxr,mem MOVQ mmxr,mmxr Instrukce MMX – datové přesuny

  33. Sčítání PADDB mmxr,mmxr PADDB mmxr,mem PADDW, PADDD PADDSB, PADDSW PADDUSB, PADDUSW Odčítání PSUBB, PSUBW, PSUBD PSUBSB, PSUBSW PSUBUSB, PSUBUSW Násobení PMULL, PMULH Násobení a sečtení PMADDWD Instrukce MMX – aritmetika

  34. Stažení PACKSSWB, PACKSSDW PACKUSWB Rozbalení PUNPCKHBW PUNPCKHWD PUNPCKHDQ PUNPCKLBW PUNPCKLWD PUNPCKLDQ Porovnání na rovnost PCMPEQB PCMPEQW PCMPEQD Porovnání na > PCMPGTB PCMPGTW PCMPGTD Instrukce MMX – porovnání a konverze

  35. Logické PAND PANDN POR PXOR Posuvy PSLLW, PSLLD, PSLLQ PSRLW, PSRLD, PSRLQ PSRAW, PSRAD EMMS (Empty MMX state) EMMS Instrukce MMX – logické a posuvy, EMMS

  36. Přechody MMX a FPU • Přechod FPU→MMX • Libovolná instrukce MMX kromě EMMS • FPU nastavení: • TOP v SW je 0 • Tag registr je celý 0 • V exponentech registrů jsou 1 • Přechod MMX→FPU • Použít instrukci EMMS • Míchaný kód (volací konvence!) • Při použití MMX ve funkci je nutno uložit/obnovit stav FPU

  37. Výpočetní prostředí SSE • 128-bitové datové registry • Intel 64 má navíc 8 registrů XMM8-XMM15

  38. Výpočetní prostředí SSE – řídící/stavový registr • Stavový i řídící registr MXCSR

  39. Datové typy SSE • Čtyři „floaty“

  40. Instrukce SSE – I • Pakované a skalární float operace • 64-bitové SIMD celočíselné instrukce • Instrukce na řízení stavu • Řízení cache, prefetch, pořadí paměťových operací

  41. Instrukce SSE – II • Pakované a skalární float operace • Přesuny dat • Aritmetické instrukce • Logické instrukce • Porovnání • Míchání • Konverze

  42. Instrukce SSE - přesuny • Aligned 16B, unaligned MOVAPS, MOVUPS • SP skalár MOVSS • Low, high 2 SP MOVLPS, MOVHPS • Low-high, high-low 2 SP MOVLHPS, MOVHLPS • 4 nejvýznamnější bity SP do 4 bitů obecného registru MOVMSKPS

  43. Instrukce SSE – aritmetické a logické • SIMD aritmetické operace ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, RSQRTPS, MAXPS, MINPS • Skalární aritmetické operace ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, RSQRTSS, MAXSS, MINSS • Logické operace ANDPS, ANDNPS, ORPS, XORPS • Porovnání CMPPS, CMPSS, COMISS, UCOMISS

  44. Instrukce SSE – míchání • Zamíchání podle masky SHUFPS • Proložení UNPCKHPS UNPCKLPS

  45. Instrukce SSE – konverze • Konverze 2 DW INT↔ 2 PS • CVTPI2PS, CVTPS2PI, CVTTPS2PI • Viz obrázek později • Konverze 1 DW INT↔ skalár PS • CVTSI2SS, CVTSS2SI • Viz obrázek později

  46. Instrukce SSE – rozšíření MMX • Přesuny PEXTRW, PINSRW PMOVMSKB PSHUFW • Aritmetické PMULHUW • Agregační PAVGB, PMAXUB, PMINUB, PMAXSW, PMINSW, PSADBW

  47. Instrukce SSE – netemporální data • Netemporální data • Některé MM operace zapisují data, která nebudou v nejbližší budoucnosti zapotřebí • Je třeba zabránit zanesení cache • Data se neukládají do cache • Pokud jsou v cache, cache-line označena jako oběť • Zápis s WC sémantikou • Není zaručeno pořadí zápisu, slučování ve WC bufferech

  48. Instrukce SSE – netemporální přesuny, řízení cache • Netemporální přesuny MOVNTQ, MOVNTPS, MASKMOVQ • Řízení přednačítání PREFETCHh • h je hint • T0 – temporální data do všech úrovní • Tx – temporální data do úrovně nejvýše x • NTA – netemporální data co nejblíže k CPU bez zanesení cache • Pořadí paměťových operací SFENCE

  49. Práce s MXCSR LDMXCSRmem STMXCSRmem Stav SSE FXSAVE FXRSTOR Zavedeny před SSE v Pentium II jako rychlé uložení/načtení stavu FPU Nejsou součástí SSE Nyní ukládají stav XMM, MXCSR, FPU, MMX Instrukce SSE – stav

  50. Datové typy SSE2 • 128-bitové celočíselné typy • Dva „double“

More Related