610 likes | 772 Vues
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
E N D
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 • 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
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
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
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
SSE végrehajtási környezet BBTE, Alkalmazások és operációs rendszerek optimizálása
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
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
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
SSE egész ábrázolás BBTE, Alkalmazások és operációs rendszerek optimizálása
SSE lebegőpontos ábrázolás BBTE, Alkalmazások és operációs rendszerek optimizálása
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
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
SSE kontroll regiszter 1 BBTE, Alkalmazások és operációs rendszerek optimizálása
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
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
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
SSE/Int – Adatátviteli utasítások 1 BBTE, Alkalmazások és operációs rendszerek optimizálása
SSE/Int – Adatátviteli utasítások 2 BBTE, Alkalmazások és operációs rendszerek optimizálása
SSE/Float – Adatátviteli utasítások 1 BBTE, Alkalmazások és operációs rendszerek optimizálása
SSE/Float – Adatátviteli utasítások 2 BBTE, Alkalmazások és operációs rendszerek optimizálása
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
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
SSE/Int – Aritmetikai utasítások 2 PMADDWD PMULUDQ BBTE, Alkalmazások és operációs rendszerek optimizálása
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
SSE/Float – Aritmetikai utasítások 4 BBTE, Alkalmazások és operációs rendszerek optimizálása
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
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
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
SSE példa – Vektor szorzás 4 ...DEMO... BBTE, Alkalmazások és operációs rendszerek optimizálása
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
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
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
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
... 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
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
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
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
SSE példa – Sormátrix szorzása 9 ...DEMO... BBTE, Alkalmazások és operációs rendszerek optimizálása
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
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
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
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
SSE/Float – Összehasonlító utasítások 2 CMPPD COMISD BBTE, Alkalmazások és operációs rendszerek optimizálása
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
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
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
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
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
__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