1 / 67

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

gunnar
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 –AESNI • AESNI • AES New Instructions • 6 instrukcí pro kódování/dekódování AES • PCLMULQDQ – carrylessmultiplicationoftwo 64-bit numbers

  9. 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

  10. Ještě jednou historie – AVX2 • AVX2 • Přidání velké většiny celočíselných vektorových instrukcí do AVX • Haswell

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

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

  13. 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)

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

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

  16. 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

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

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

  19. 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

  20. 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

  21. 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

  22. 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í

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

  24. 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í

  25. 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í

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

  27. 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)

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

  29. 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

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

  31. Datové typy MMX

  32. SIMD model

  33. 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

  34. 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

  35. 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

  36. 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

  37. 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

  38. 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

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

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

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

  42. 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í

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

  44. 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

  45. 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

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

  47. 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

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

  49. 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

  50. 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

More Related