1 / 59

SSE assembly programozás

SSE assembly programozás. 7. előadás dr. Robu Judit szeminárium drd. Lukács Sándor. 2006. Referenciák. AMD x86-64 Architecture Programmer ’s Manual, Volume 4: 128-bit Media Instructions Revision 3.03, August 2002 kiváló képek, ábrák

andra
Download Presentation

SSE assembly programozás

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. SSE assembly programozás 7 előadás dr. Robu Judit szeminárium drd. Lukács Sándor 2006

  2. Referenciák • AMD x86-64 Architecture Programmer’s Manual, Volume 4: 128-bit Media Instructions • Revision 3.03, August 2002 • kiváló képek, ábrák • IA-32 Intel Architecture Software Developer’s Manual, Volume 2: Instruction Set Reference • a 2000-es kiadásban voltak hibák, pl. PACKSSDW • megtalálható benne a C/C++ compiler intrinsics-ek rövid leírása BBTE, Alkalmazások és operációs rendszerek optimizálása

  3. SSE végrehajtási modell • SIMD modell – Single Instruction Multiple Data • a legtöbb mai PC és Workstation kategóriájú processzor ezt a modellt (is) támogatja BBTE, Alkalmazások és operációs rendszerek optimizálása

  4. SIMD végrehajtás • a műveletek párhuzamosan végződnek el több operanduson • implementáció szerint, vagy ugyanabban az óraciklusban mind a négy (Intel Core 2), vagy kettessével (Intel NetBurst) BBTE, Alkalmazások és operációs rendszerek optimizálása

  5. SIMD technológiák x86-os platformokon • MMX – 1996, Intel Pentium MMX • egész műveletek, az első x86-os SIMD szett • 3DNow! – 1998, AMD K6-2 • lebegőpontos műveletek 64 bites MMX regiszterken • PREFETCH utasítás – adat-cache vonal explicit betöltése • SSE – 1999, Intel Pentium III • lebegőpontos műveletek új, 128 bites XMM regisztereken • kibővített utasításszett MMX egész műveletek számára • SSE2 – 2000, Intel Pentium 4 • egész műveletek a 128 bites XMM regisztereken BBTE, Alkalmazások és operációs rendszerek optimizálása

  6. SSE végrehajtási környezet BBTE, Alkalmazások és operációs rendszerek optimizálása

  7. SSE regiszterszett • 8 új, 128 bites regiszter32 bites üzemmódban • 16 új, 128 bites regiszter64 bites üzemmódban • MXCSR, 32 bites kontrollés státuszregiszter • STMXCSR m32 • LDMXCSR m32 • alapérték 0x00001F80 • a regiszterek függetlenek a FPU/MMX regiszterektől XMM0 XMM1 mindig elérhető … XMM7 XMM8 … 64 bit specifikus XMM15 MXCSR BBTE, Alkalmazások és operációs rendszerek optimizálása

  8. SSE adattípusok 1 • két új lebegőpontos adattípus • 128 bites tömörített egyszeres pontosságú valós • 128 bites tömörített, kétszeres pontosságú valós BBTE, Alkalmazások és operációs rendszerek optimizálása

  9. SSE adattípusok 2 • az SSE 128 bitre bővítette az MMX tömörített egész adatípusait BBTE, Alkalmazások és operációs rendszerek optimizálása

  10. SSE egész ábrázolás BBTE, Alkalmazások és operációs rendszerek optimizálása

  11. SSE lebegőpontos ábrázolás BBTE, Alkalmazások és operációs rendszerek optimizálása

  12. SSE lebegőpontos értéktípusok • normalizált értékek • a szignifikáns [1,2) intervalumon belüli érték • a szám nagyságrendjét kizárólag az exponens határozza meg • denormalizált értékek (nagyon kis értékek) • a szám nagyságrendje kisebb, mint az adattípus alsó határa (pl. < 2-126egyszeres pontosság esetén) • a számot mégis ábrázoljuk, 0-ás egész résszel • nulla • van pozitív és negatív nulla • végtelen • van pozitív és negatív végtelen • nem-szám (not-a-number, NaN) értékek • QNaN (Quiet NaN) – a processzor nem generál kivételt • SNaN (Signalling NaN) – a processzor kivételt generál BBTE, Alkalmazások és operációs rendszerek optimizálása

  13. Túlcsordulás vezérlés • egész adatípusok esetén azonos az MMX-ben is jelenlévő három típussal • túlcsordulásos • előjeles korlátozás (signed saturation) • előjel nélküli korlátozás (unsigned saturation) • lebegőpontos műveletek esetén nincs túlcsorduáls korlátozás – akárcsak FPU esetén • vannak jelzőbittek és kivételek • #19-es kivétel – SSE lebegőpontos kivétel BBTE, Alkalmazások és operációs rendszerek optimizálása

  14. SSE kontroll regiszter 1 BBTE, Alkalmazások és operációs rendszerek optimizálása

  15. SSE kontroll regiszter 2 • 6 kivétel jelző bit IE, DE, ZE, OE, UE, PE • 6 kivétel maszkbit IM, DM, ZM, OM, UM, PM • ha 0, engedélyezett a kivétel • ha 1, a kivétel tiltott • négy lebegőpontos kerekítési módot támogat az SSE • 00 – legközelebbi érékhez (round to nearest) • 01 – lefele kerekítés (round down) • 10 – felfele kerekítés (round up) • 11 – nulla fele kerekítés (round toward zero) BBTE, Alkalmazások és operációs rendszerek optimizálása

  16. SSE utasítások – Bevezető 1 • előtagok / prefixek • CVT – konverizó • CVTT – konverizó kerekítéssel (truncation) • P – tömörített / vektor művelet • PACK – tömörítés (2x szélességből 1x szélességbe) • PUNPCK – kitömörítés és felváltva helyezés • UNPACK – kitömörítés és felváltva helyezés • utótagok / suffixek, más jelölések • B, W, D, Q, DQ – adatméret • H – rangosabb fél (high) • L – kevésbé rangos fél (low) vagy bal részoprandus (left) BBTE, Alkalmazások és operációs rendszerek optimizálása

  17. SSE utasítások – Bevezető 2 • utótagok / suffixek, más jelölések • PS – vektoriális egyszeres pontosságú lebegőpontos • PD – vektoriális kétszeres pontosságú lebegőpontos • SS – skaláris egyszeres pontosságú lebegőpontos, VAGYSS – előjeles korlátozás (signed saturation) • SD – skaláris kétszeres pontosságú lebegőpontos • US – előjel nélküliu korlátozás (unsigned saturation) • PI – tömörített egész • SI – előjeles egész • S – előjeles, korlátozás vagy shift • U – előjel nélküli, unorderes, unaligned BBTE, Alkalmazások és operációs rendszerek optimizálása

  18. SSE/Int – Adatátviteli utasítások 1 BBTE, Alkalmazások és operációs rendszerek optimizálása

  19. SSE/Int – Adatátviteli utasítások 2 BBTE, Alkalmazások és operációs rendszerek optimizálása

  20. SSE/Float – Adatátviteli utasítások 1 BBTE, Alkalmazások és operációs rendszerek optimizálása

  21. SSE/Float – Adatátviteli utasítások 2 BBTE, Alkalmazások és operációs rendszerek optimizálása

  22. SSE – További adatátviteli utasítások • előjel bitmaszk generálás • MASKMOVDQU, PMOVMSKB • MOVMSKPS, MOVMSKPD • non-temporális / streaming tárolás • nem tárolja az adatot a processzor cachejeiben • MOVNTI, MOVNTQ, MOVNTDQ • MOVNTPS, MOVNTPD BBTE, Alkalmazások és operációs rendszerek optimizálása

  23. SSE/Int – Aritmetikai utasítások 1 • összeadás • PADDB, PADDW, PADDD, PADDQ • PADDSB, PADDSW • PADDUSB, PADDUSW • kivonás • PSUBB, PSUBW, PSUBD, PSUBQ • PSUBSB, PSUBSW • PSUBUSB, PSUBUSW • szorzás, szorzás-összeadás • PMULHW, PMULLW, PMULHUW • PMULUDQ – DWORD szorzás és QWORD eredmények tárolása • PMADDWD – WORD szorzás, majd DWORD eredmények összegzése • PSADBW – BYTE abszolút különbségek WORD összege • átlag számítások • PAVGB, PAVGW – előjel nélküli műveletek BBTE, Alkalmazások és operációs rendszerek optimizálása

  24. SSE/Int – Aritmetikai utasítások 2 PMADDWD PMULUDQ BBTE, Alkalmazások és operációs rendszerek optimizálása

  25. SSE/Float – Aritmetikai utasítások 3 • összeadás, kivonás • ADDPS, ADDPD – vektoriális / tömörített összeadás • ADDSS, ADDSD – skaláris összeadás, a rangosabb regiszterrészek nem módosulnak • SUBPS, SUBPD, SUBSS, SUBSD • szorzás, osztás • MULPS, MULPD, MULSS, MULSD • DIVPS, DIVPD, DIVSS, DIVSD • négyzetgyök és inverz (1/x) számítások • SQRTPS, SQRTPD, SQRTSS, SQRTSD • RSQRTPS, RSQRTSS • RCPPS, RCPSS BBTE, Alkalmazások és operációs rendszerek optimizálása

  26. SSE/Float – Aritmetikai utasítások 4 BBTE, Alkalmazások és operációs rendszerek optimizálása

  27. var StartTime, StopTime: Int64; function RDTSC: Int64; assembler; asm rdtsc // TIME STAMP COUNTER end; procedure Start; begin StartTime := RDTSC; end; function Stop: Int64; begin StopTime := RDTSC; Result := StopTime - StartTime; end; const N = 100; // 100 szó elfér az L1 cache-ben K = 1000000; // többszörös végrehajtás, egyetlen // végrehajtás idejét nem igazaán // lehet pontosan lemérni type TSingleVector = array[0..N-1] ofSingle; var a1, b1, c1: TSingleVector; a2, b2, c2: TSingleVector; i: Integer; ... SSE példa – Vektor szorzás 1 BBTE, Alkalmazások és operációs rendszerek optimizálása

  28. function FpuMulVector(var a, b, c: TSingleVector; N: Integer): Int64; var i, j: Integer; begin Start; for j := 0 to K-1 do for i := 0 to N-1 do c[i] := a[i] * b[i]; Result := Stop; end; klasszikus, FPU-val történő lebegőpontos szorzások ... for i := 0 to N-1 do begin a1[i] := Random; b1[i] := Random; a2[i] := a1[i]; b2[i] := b1[i]; end; fpu := FpuMulVector(a1, b1, c1, N); sse := SseMulVector(a2, b2, c2, N); writeln(‘fpu = ', fpu, ' ticks'); writeln(‘sse = ', sse, ' ticks'); writeln(' x = ', fpu/sse:5:3); ... SSE példa – Vektor szorzás 2 BBTE, Alkalmazások és operációs rendszerek optimizálása

  29. function SseMulVector(var a, b, c: TSingleVector; N: Integer): Int64; assembler; asm mov esi, a mov edi, b mov edx, c ... mov eax, K @next2: pop edx pop edi pop esi push esi push edi push edx mov ecx, N shr ecx, 2 @next: movups xmm0, [edi] movups xmm1, [esi] mulps xmm0, xmm1 movups [edx], xmm0 add edi, 16 add esi, 16 add edx, 16 sub ecx, 1 jnz @next sub eax, 1 jnz @next2 ... // nem kell EMMS! end; SSE példa – Vektor szorzás 3 BBTE, Alkalmazások és operációs rendszerek optimizálása

  30. SSE példa – Vektor szorzás 4 ...DEMO... BBTE, Alkalmazások és operációs rendszerek optimizálása

  31. SSE példa – Sormátrix szorzása 1 • oszlopmátrixok esetén más Bi,j formula van BBTE, Alkalmazások és operációs rendszerek optimizálása

  32. műveletelvégzési lehetőségek oszloponként soronként SSE példa – Sormátrix szorzása 2 type TQuad = array [0..3] of Single; TQuadVector = array [0..N-1] of TQuad; TMatrix = array [0..3] of TQuad; ... for i := 0 to N-1 do begin b[i][0] := a[i][0]*t[0][0] + a[i][1]*t[1][0] + a[i][2]*t[2][0] + a[i][3]*t[3][0]; b[i][1] := a[i][0]*t[0][1] + a[i][1]*t[1][1] + a[i][2]*t[2][1] + a[i][3]*t[3][1]; b[i][2] := a[i][0]*t[0][2] + a[i][1]*t[1][2] + a[i][2]*t[2][2] + a[i][3]*t[3][2]; b[i][3] := a[i][0]*t[0][3] + a[i][1]*t[1][3] + a[i][2]*t[2][3] + a[i][3]*t[3][3]; end; ... BBTE, Alkalmazások és operációs rendszerek optimizálása

  33. function SseMulMat(var a, b: TQuadVector; N: Integer;var t: TMatrix): Int64; assembler; asm mov esi, a mov edi, b mov edx, t mov ecx, N push esi push edi push ecx movups xmm4, [edx] movups xmm5, [edx+16] movups xmm6, [edx+32] movups xmm7, [edx+48] ... ... mov eax, K ... @next2: pop ecx pop edi pop esi push esi push edi push ecx @next: xorps xmm3, xmm3 movups xmm0, [esi] movaps xmm2, xmm0 ... SSE példa – Sormátrix szorzása 3 BBTE, Alkalmazások és operációs rendszerek optimizálása

  34. XMM2 XMM0 XMM4 XMM7 XMM5 XMM6 T2,3 A3 T3,3 A3 T0,3 T1,3 A2 A2 T3,2 T2,2 T1,2 T0,2 T1,1 T2,1 A1 A1 T0,1 T3,1 A0 T0,0 T2,0 T3,0 A0 T1,0 XMM3 0 0 0 0 SSE példa – Sormátrix szorzása 4 BBTE, Alkalmazások és operációs rendszerek optimizálása

  35. ... shufps xmm0, xmm0, $00 mulps xmm0, xmm4 addps xmm3, xmm0 movaps xmm1, xmm2 shufps xmm1, xmm1, $55 mulps xmm1, xmm5 addps xmm3, xmm1 movaps xmm0, xmm2 shufps xmm0, xmm0, $AA mulps xmm0, xmm6 addps xmm3, xmm0 ... ... shufps xmm2, xmm2, $FF mulps xmm2, xmm7 addps xmm3, xmm2 movups [edi], xmm3 add edi, 16 add esi, 16 loop @next sub eax, 1 jnz @next2 ... end; SSE példa – Sormátrix szorzása 5 BBTE, Alkalmazások és operációs rendszerek optimizálása

  36. XMM4 XMM0 XMM0 XMM0 A3 T0,3 A0T0,3 A0 A2 T0,2 A0T0,2 A0 A1 A0T0,1 T0,1 A0 T0,0 A0 A0 A0T0,0 XMM3 A0T0,3 A0T0,2 A0T0,1 A0T0,0 SSE példa – Sormátrix szorzása 6 shufps xmm0,xmm0,$00 00.00.00.00 mulps xmm0,xmm4 addps xmm3,xmm0 BBTE, Alkalmazások és operációs rendszerek optimizálása

  37. XMM5 XMM1 XMM1 XMM1 A3 T1,3 A1T1,3 A1 A2 T1,2 A1T1,2 A1 A1 A1T1,1 T1,1 A1 T1,0 A1 A0 A1T1,0 XMM3 A1T1,3+A0T0,3 A1T1,2+A0T0,2 A1T1,1+A0T0,1 A1T1,0+A0T0,0 SSE példa – Sormátrix szorzása 7 shufps xmm1,xmm1,$55 01.01.01.01 mulps xmm1,xmm5 addps xmm3,xmm1 BBTE, Alkalmazások és operációs rendszerek optimizálása

  38. XMM7 XMM2 XMM2 XMM2 A3 T3,3 A3T3,3 A3 A2 T3,2 A3T3,2 A3 A1 A3T3,1 T3,1 A3 T3,0 A3 A0 A3T3,0 XMM3 A3T3,3+... A3T3,2+... A3T3,1+... A3T3,0+... SSE példa – Sormátrix szorzása 8 shufps xmm2,xmm2,$FF 11.11.11.11 mulps xmm2,xmm7 addps xmm3,xmm2 BBTE, Alkalmazások és operációs rendszerek optimizálása

  39. SSE példa – Sormátrix szorzása 9 ...DEMO... BBTE, Alkalmazások és operációs rendszerek optimizálása

  40. SSE – Shift utasítások • bal-shift • PSLLW, PSLLD, PSLLQ, PSLLDQ • jobb-shift • PSRLW, PSRLD, PSRLQ, PSRLDQ • aritmetikai shift • PSRAW, PSRAD BBTE, Alkalmazások és operációs rendszerek optimizálása

  41. SSE – Logikai utasítások • egész értékek esetén • PAND, PANDN, POR, PXOR • lebegőpontos értékek esetén • ANDPS, ANDPD, ANDNPS, ANDNPD • ORPS, ORPD, XORPS, XORPD • NINCS különbség az egész és lebegőpontos változatok végrehajtása között BBTE, Alkalmazások és operációs rendszerek optimizálása

  42. SSE/Int – Összehasonlító utasítások • összehasonlítás és maszk generálása • PCMPEQB, PCMPEQW, PCMPEQD • PCMPGTB, PCMPGTW, PCMPGTD • minimum-maximum kiválasztás • PMINUB, PMAXUB • PMINSW, PMAXSW BBTE, Alkalmazások és operációs rendszerek optimizálása

  43. SSE/Float – Összehasonlító utasítások 1 • összehasonlítás és maszk generálása • CMPPS, CMPPD, CMPSS, CMPSD • skaláris összehasonlítás és EFLAGS jelzőbittek beállítása (ZF, PF, CF) • COMISS, COMISD • UCOMISS, UCOMISD • csak SNaN-ok esetén generálnak kivételt, QNaN esetén nem • minimum-maximum kiválasztása • MINPS, MAXPS, MINPD, MAXPD • MINSS, MAXSS, MINSD, MAXSD BBTE, Alkalmazások és operációs rendszerek optimizálása

  44. SSE/Float – Összehasonlító utasítások 2 CMPPD COMISD BBTE, Alkalmazások és operációs rendszerek optimizálása

  45. r0 = a0>b0?a0:b0 r1 = a1>b1?a1:b1 r2 = a2>b2?a2:b2 r3 = a3>b3?a3:b3 r4 = a4>b4?a4:b4 r5 = a5>b5?a5:b5 r6 = a6>b6?a6:b6 r7 = a7>b7?a7:b7 MOVQ xmm3, xmm0 ; a > b ? 0xffff : 0 PCMPGTW xmm3, xmm2 ; a > b ? a: 0 PAND xmm0, xmm3 ; a > b ? 0 : b PANDN xmm3, xmm1 ; r = a > b ? a: b POR xmm0, xmm3 SSE példa – Összehasonlítás BBTE, Alkalmazások és operációs rendszerek optimizálása

  46. SSE/Int – Kitömörítő, betömörítő és adatátrendező utasítások 1 • kitömörítés és felváltva elhelyezés • PUNPCKHBW, PUNPCKLBW • PUNPCKHWD, PUNPCKLWD • PUNPCKHDQ, PUNPCKLDQ • PUNPCKHQDQ, PUNPCKLQDQ • betömörítés és korlátozás • PACKSSDW, PACKSSWB • PACKUSWB • adatok keverése (shuffle) • PSHUFHW, PSHUFLW, PSHUFD • adatok beszúrása / kimásolása • PINSRW, PEXTRW BBTE, Alkalmazások és operációs rendszerek optimizálása

  47. SSE/Int – Kitömörítő, betömörítő és adatátrendező utasítások 2 PSHUFD PINSRW PSHUFHW BBTE, Alkalmazások és operációs rendszerek optimizálása

  48. SSE/Float – Kitömörítő és adatátrendező utasítások 1 • kitömörítés és felváltva elhelyezés • UNPCKHPS, UNPCKHPD • UNPCKLPS, UNPCKLPD • adatok keverése • SHUFPS – 2-2 tetszőleges operandust helyez el a két forrás regiszterből a cél regiszterbe • SHUFPD – 1-1 tetszőleges operandust helyez el a két forrás regiszterből a cél regiszterbe BBTE, Alkalmazások és operációs rendszerek optimizálása

  49. SSE/Float – Kitömörítő és adatátrendező utasítások 2 SHUFPS UNPCKLPS BBTE, Alkalmazások és operációs rendszerek optimizálása

  50. __m128 a, b, c, d; a.m128_u64[1] = 0x7777666655554444; a.m128_u64[0] = 0x3333222211110000; __asm { pxor xmm0, xmm0 movdqu xmm2, a movdqu xmm3, xmm2 a 7777.6666.5555.4444.3333.2222.1111.0000 b 0000.7777.0000.6666.0000.5555.0000.4444 c 0000.3333.0000.2222.0000.1111.0000.0000 d 7777.6666.5555.4444.3333.2222.1111.0000 SSE példa – Kitömörítés-betömörítés1 punpckhwd xmm3, xmm0 punpcklwd xmm2, xmm0 movdqu b, xmm3 movdqu c, xmm2 packssdw xmm2, xmm3 movdqu d, xmm2 } BBTE, Alkalmazások és operációs rendszerek optimizálása

More Related