Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Alkalmazások és operációs rendszerek optimizálása „Babeş-Bolyai” Tudományegyetem, Matematika-Informatika Kar SSE assembly programozás előadás dr. Robu.

Hasonló előadás


Az előadások a következő témára: "Alkalmazások és operációs rendszerek optimizálása „Babeş-Bolyai” Tudományegyetem, Matematika-Informatika Kar SSE assembly programozás előadás dr. Robu."— Előadás másolata:

1 Alkalmazások és operációs rendszerek optimizálása „Babeş-Bolyai” Tudományegyetem, Matematika-Informatika Kar SSE assembly programozás előadás dr. Robu Judit szeminárium drd. Lukács Sándor

2 BBTE, Alkalmazások és operációs rendszerek optimizálása 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

3 2006BBTE, 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 SISD általános utasítások SIMD tipikus multimédia utasítások MISD gyakorlatban nem használt MIMD kísérleti formában használt

4 2006BBTE, 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)

5 2006BBTE, 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

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

7 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 7 SSE regiszterszett 8 új, 128 bites regiszter 32 bites üzemmódban 16 új, 128 bites regiszter 64 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 XMM7 XMM8 XMM15 … … MXCSR mindig elérhető 64 bit specifikus

8 2006BBTE, 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

9 2006BBTE, 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

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

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

12 2006BBTE, 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. < egyszeres 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

13 2006BBTE, 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

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

15 2006BBTE, 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)

16 2006BBTE, 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)

17 2006BBTE, 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, VAGY SS – 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

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

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

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

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

22 2006BBTE, 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

23 2006BBTE, 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

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

25 2006BBTE, 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

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

27 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 27 SSE példa – Vektor szorzás 1 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 = ; // 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] of Single; var a1, b1, c1: TSingleVector; a2, b2, c2: TSingleVector; i: Integer;...

28 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 28 SSE példa – Vektor szorzás 2 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);...

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

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

31 2006BBTE, 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 B i,j formula van

32 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 32 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;... műveletelvégzési lehetőségek oszloponként soronként

33 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 33 SSE példa – Sormátrix szorzása 3 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 xmm5, [edx+16] movups xmm6, [edx+32] movups xmm6, [edx+32] movups xmm7, [edx+48] movups xmm7, [edx+48]... mov eax, pop ecx pop edi pop esi push esi push edi push xorps xmm3, xmm3 xorps xmm3, xmm3 movups xmm0, [esi] movups xmm0, [esi] movaps xmm2, xmm0 movaps xmm2, xmm0...

34 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 34 SSE példa – Sormátrix szorzása 4 T 0,3 T 0,2 T 0,1 T 0,0 XMM4 T 1,3 T 1,2 T 1,1 T 1,0 XMM5 T 2,3 T 2,2 T 2,1 T 2,0 XMM6 T 3,3 T 3,2 T 3,1 T 3,0 XMM XMM3 A3A3 A2A2 A1A1 A0A0 XMM0 A3A3 A2A2 A1A1 A0A0 XMM2

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

36 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 36 SSE példa – Sormátrix szorzása 6 A3A3 A2A2 A1A1 A0A0A0A0 XMM0 A 0 T 0,3 A 0 T 0,2 A 0 T 0,1 A 0 T 0,0 XMM0 A0A0A0A0 A0A0A0A0 A0A0A0A0 A0A0A0A0 A 0 T 0,3 A 0 T 0,2 A 0 T 0,1 A 0 T 0,0 XMM3 shufps xmm0,xmm0,$ mulps xmm0,xmm4 addps xmm3,xmm0 T 0,3 T 0,2 T 0,1 T 0,0 XMM4

37 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 37 SSE példa – Sormátrix szorzása 7 A3A3 A2A2 A1A1A1A1 A0A0 XMM1 A 1 T 1,3 A 1 T 1,2 A 1 T 1,1 A 1 T 1,0 XMM1 A1A1A1A1 A1A1A1A1 A1A1A1A1 A1A1A1A1 A 1 T 1,3 +A 0 T 0,3 A 1 T 1,2 +A 0 T 0,2 A 1 T 1,1 +A 0 T 0,1 A 1 T 1,0 +A 0 T 0,0 XMM3 shufps xmm1,xmm1,$ mulps xmm1,xmm5 addps xmm3,xmm1 T 1,3 T 1,2 T 1,1 T 1,0 XMM5

38 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 38 SSE példa – Sormátrix szorzása 8 A3A3A3A3 A2A2 A1A1 A0A0 XMM2 A 3 T 3,3 A 3 T 3,2 A 3 T 3,1 A 3 T 3,0 XMM2 A3A3A3A3 A3A3A3A3 A3A3A3A3 A3A3A3A3 A 3 T 3,3 +...A 3 T 3,2 +...A 3 T 3,1 +...A 3 T 3, XMM3 shufps xmm2,xmm2,$FF mulps xmm2,xmm7 addps xmm3,xmm2 T 3,3 T 3,2 T 3,1 T 3,0 XMM7

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

40 2006BBTE, 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

41 2006BBTE, 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

42 2006BBTE, 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

43 2006BBTE, 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

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

45 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 45 SSE példa – Összehasonlítás 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

46 2006BBTE, 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

47 2006BBTE, 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 PINSRW PSHUFD PSHUFHW

48 2006BBTE, 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

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

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

51 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 51 SSE példa – Kitömörítés-betömörítés 2...DEMO...

52 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 52 SSE/Int – Konverziós utasítások XMM egészből – lebegőpontosba CVTDQ2PS CVTDQ2PD MMX egészből – lebegőpontosba CVTPI2PS CVTPI2PD GPR egészből – lebegőpontosba CVTSI2SS CVTSI2SD

53 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 53 SSE/Float – Konverziós utasítások 1 lebegőpontosból – lebegőpontosba CVTPS2PD CVTPD2PS CVTSS2SD CVTSD2SS lebegőpontosból – XMM egészbe CVTPS2DQ CVTPD2DQ CVTTPS2DQ CVTTPD2DQ

54 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 54 SSE/Float – Konverziós utasítások 2 lebegőpontosból – MMX egészbe CVTPS2PI CVTPD2PI CVTTPS2PI CVTTPD2PI lebegőpontosból – GPR egészbe CVTSS2SI CVTSD2SI CVTTSS2SI CVTTSD2SI

55 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 55 SSE példa – Hangerősség 1 a hangadatok (minták) 16 bites, előjeles egészek sztereo hang esetén egymás után váltakozva helyezkednek el a két csatorna 16 bites mintái (együtt 32 bit egy BAL,JOBB páros) BAL k,JOBB k,BAL k+1,JOBB k+1,BAL k+2,JOBB k+2,... minta (sample) értékek 0 – hangtalan , – maximális hangerő hangosítás = a minták szorzása konstanssal x 2 – kétszeres hangerő x 0.5 – fél hangerő a végső érzékelt hangerő nem úgyanúgy módosul; az embeli fül számára logaritmikus skálán kell módosítani a hangerőt (DB) ebben a prezentációban a példát NEM fogom részletesen kielemezni az ASM szintű optimizációról szolló prezentáció keretében kerül sor rá

56 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 56 SSE példa – Hangerősség 2 // get volume factor 0 – 1024 fact := tckAmplify.Position; for i := start to stop do begin // amplify left channel temp := Wave.Buffer[2*i]; temp := (temp*fact) div 512; if (temp < ) then Wave.Buffer[2*i] := else if (temp > ) then Wave.Buffer[2*i] := else Wave.Buffer[2*i] := temp;... // amplify right channel temp := Wave.Buffer[2*i+1]; temp := (temp*fact) div 512; if (temp < ) then Wave.Buffer[2*i+1] := else if (temp > ) then Wave.Buffer[2*i+1] := else Wave.Buffer[2*i+1] := temp; end; x0 – x2 hangerő skála → 0 – – x0 hangerő 512 – x1 hangerő 1024 – x2 hangerő

57 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 57 SSE példa – Hangerősség 3 asm // setup indexing mov edx, paddr mov eax, start // eax = i // setup zero XMM register pxor xmm0, xmm0 // setup factor XMM register movd xmm1, factor pshufd xmm1, xmm1, $00 // load source wave // process 2x16 bit samples(L/R) movdqu xmm2, [edx + eax*4] movdqu xmm3, xmm2 // unpack samples to 32 bit punpcklwd xmm2, xmm0 punpckhwd xmm3, xmm0... // multiply samples by 0 – 1024 // (and add with zero) pmaddwd xmm2, xmm1 pmaddwd xmm3, xmm1 // divide samples by 512 psrad xmm2, 9 psrad xmm3, 9 // pack samples to 16 bit with // signed saturation packssdw xmm2, xmm3 // store destination samples movdqu [edx + eax*4], xmm2 // loop to next samples // 4 x (2x16) bit each step add eax, 4 cmp eax, stop end;

58 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 58 SSE példa – Hangerősség 4...DEMO...

59 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 59 Köszönöm a figyelmet!


Letölteni ppt "Alkalmazások és operációs rendszerek optimizálása „Babeş-Bolyai” Tudományegyetem, Matematika-Informatika Kar SSE assembly programozás előadás dr. Robu."

Hasonló előadás


Google Hirdetések