Une image / un lien ci-dessous est fourni (tel quel) pour télécharger la présentation
Politique de téléchargement : le contenu du site vous est fourni TEL QUEL pour votre information et votre usage personnel ; il ne peut être vendu, concédé sous licence ni partagé sur d’autres sites sans l’accord de son auteur.Le contenu vous est fourni TEL QUEL, pour votre information et votre usage personnel uniquement.Téléchargez la présentation en cliquant sur ce lien.Lors du téléchargement, si vous ne parvenez pas à télécharger une présentation, l’éditeur a peut-être supprimé le fichier de son serveur.Pendant le téléchargement, si vous ne parvenez pas à obtenir une présentation, le fichier a peut-être été supprimé par l’éditeur.
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 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 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 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
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 – 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
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
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