sse assembly programozás

Post on 30-Jan-2016

55 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

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 - PowerPoint PPT Presentation

TRANSCRIPT

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 Juditszeminárium

drd. Lukács Sándor

7

2006

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

2Referenciá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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

3SSE végrehajtási modell

SIMD modell – Single Instruction Multiple Dataa legtöbb mai PC és Workstation kategóriájú

processzor ezt a modellt (is) támogatja

SISDáltalános utasítások

SIMDtipikus multimédia utasítások

MISDgyakorlatban nem használt

MIMDkísérleti formában használt

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

4SIMD 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)

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

5SIMD 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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

6SSE végrehajtási környezet

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

7SSE 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

XMM7

XMM8

XMM15

MXCSR

min

dig

elér

het

ő64

bit

spec

ifiku

s

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

8SSE 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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

9SSE adattípusok 2

az SSE 128 bitre bővítette az MMX tömörített egész adatípusait

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

10SSE egész ábrázolás

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

11SSE lebegőpontos ábrázolás

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

12SSE 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-126 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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

13Túlcsordulás vezérlés

egész adatípusok esetén azonos az MMX-ben is jelenlévő három típussaltúlcsordulásoselő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énvannak jelzőbittek és kivételek#19-es kivétel – SSE lebegőpontos kivétel

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

14SSE kontroll regiszter 1

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

15SSE 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)

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

16SSE 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)

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

17SSE 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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

18SSE/Int – Adatátviteli utasítások 1

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

19SSE/Int – Adatátviteli utasítások 2

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

20SSE/Float – Adatátviteli utasítások 1

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

21SSE/Float – Adatátviteli utasítások 2

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

22SSE – További adatátviteli utasítások

előjel bitmaszk generálásMASKMOVDQU, PMOVMSKBMOVMSKPS, MOVMSKPD

non-temporális / streaming tárolásnem tárolja az adatot a processzor cachejeibenMOVNTI, MOVNTQ, MOVNTDQMOVNTPS, MOVNTPD

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

23SSE/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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

24SSE/Int – Aritmetikai utasítások 2

PMULUDQ

PMADDWD

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

25SSE/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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

26SSE/Float – Aritmetikai utasítások 4

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

27SSE példa – Vektor szorzás 1

var StartTime, StopTime: Int64;

function RDTSC: Int64; assembler;asm rdtsc // TIME STAMP COUNTERend;

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] of

Single;

var a1, b1, c1: TSingleVector; a2, b2, c2: TSingleVector; i: Integer;

...

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

28SSE 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);...

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

29SSE 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, 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 xmm0, [edi] movups xmm1, [esi]movups xmm1, [esi] mulps xmm0, xmm1mulps xmm0, xmm1 movups [edx], xmm0movups [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;

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

30SSE példa – Vektor szorzás 4

...DEMO...

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

31SSE példa – Sormátrix szorzása 1

iiiiiiii BBBB

TTTT

TTTT

TTTT

TTTT

AAAA 3210

3,32,31,30,3

3,22,21,20,2

3,12,11,10,1

3,02,01,00,0

3210

3

0,

kjk

ik

ij TAB

•oszlopmátrixok esetén más Bi,j formula van

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

32SSE 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 dobegin

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

33SSE 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 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, K...@next2: pop ecx pop edi pop esi push esi push edi push ecx

@next: xorps xmm3, xmm3xorps xmm3, xmm3 movups xmm0, [esi]movups xmm0, [esi] movaps xmm2, xmm0movaps xmm2, xmm0...

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

34SSE példa – Sormátrix szorzása 4

T0,3 T0,2 T0,1 T0,0XMM4

T1,3 T1,2 T1,1 T1,0XMM5

T2,3 T2,2 T2,1 T2,0XMM6

T3,3 T3,2 T3,1 T3,0XMM7

0 0 0 0XMM3

A3 A2 A1 A0XMM0

A3 A2 A1 A0XMM2

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

35SSE példa – Sormátrix szorzása 5

... shufps xmm0, xmm0, $00shufps xmm0, xmm0, $00 mulps xmm0, xmm4mulps xmm0, xmm4 addps xmm3, xmm0addps xmm3, xmm0

movaps xmm1, xmm2movaps xmm1, xmm2 shufps xmm1, xmm1, $55shufps xmm1, xmm1, $55 mulps xmm1, xmm5mulps xmm1, xmm5 addps xmm3, xmm1addps xmm3, xmm1

movaps xmm0, xmm2movaps xmm0, xmm2 shufps xmm0, xmm0, $AAshufps xmm0, xmm0, $AA mulps xmm0, xmm6mulps xmm0, xmm6 addps xmm3, xmm0addps xmm3, xmm0...

... shufps xmm2, xmm2, $FFshufps xmm2, xmm2, $FF mulps xmm2, xmm7mulps xmm2, xmm7 addps xmm3, xmm2addps xmm3, xmm2

movups [edi], xmm3movups [edi], xmm3

add edi, 16 add esi, 16 loop @next sub eax, 1 jnz @next2 ...end;

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

36SSE példa – Sormátrix szorzása 6

A3 A2 A1 AA00XMM0

A0T0,3 A0T0,2 A0T0,1 A0T0,0XMM0

AA00 AA00 AA00 AA00XMM0

A0T0,3 A0T0,2 A0T0,1 A0T0,0XMM3

shufps xmm0,xmm0,$00 00.00.00.00

mulps xmm0,xmm4

addps xmm3,xmm0

T0,3 T0,2 T0,1 T0,0XMM4

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

37SSE példa – Sormátrix szorzása 7

A3 A2 AA11 A0XMM1

A1T1,3 A1T1,2 A1T1,1 A1T1,0XMM1

AA11 AA11 AA11 AA11XMM1

A1T1,3+A0T0,3 A1T1,2+A0T0,2 A1T1,1+A0T0,1 A1T1,0+A0T0,0XMM3

shufps xmm1,xmm1,$55 01.01.01.01

mulps xmm1,xmm5

addps xmm3,xmm1

T1,3 T1,2 T1,1 T1,0XMM5

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

38SSE példa – Sormátrix szorzása 8

AA33 A2 A1 A0XMM2

A3T3,3 A3T3,2 A3T3,1 A3T3,0XMM2

AA33 AA33 AA33 AA33XMM2

A3T3,3+... A3T3,2+... A3T3,1+... A3T3,0+...XMM3

shufps xmm2,xmm2,$FF 11.11.11.11

mulps xmm2,xmm7

addps xmm3,xmm2

T3,3 T3,2 T3,1 T3,0XMM7

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

39SSE példa – Sormátrix szorzása 9

...DEMO...

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

40SSE – Shift utasítások

bal-shiftPSLLW, PSLLD, PSLLQ, PSLLDQ

jobb-shiftPSRLW, PSRLD, PSRLQ, PSRLDQ

aritmetikai shiftPSRAW, PSRAD

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

41SSE – Logikai utasítások

egész értékek eseténPAND, PANDN, POR, PXOR

lebegőpontos értékek eseténANDPS, ANDPD, ANDNPS, ANDNPDORPS, ORPD, XORPS, XORPD

NINCS különbség az egész és lebegőpontos változatok végrehajtása között

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

42SSE/Int – Összehasonlító utasítások

összehasonlítás és maszk generálásaPCMPEQB, PCMPEQW, PCMPEQDPCMPGTB, PCMPGTW, PCMPGTD

minimum-maximum kiválasztásPMINUB, PMAXUBPMINSW, PMAXSW

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

43SSE/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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

44SSE/Float – Összehasonlító utasítások 2

COMISD

CMPPD

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

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

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

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

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ésUNPCKHPS, UNPCKHPDUNPCKLPS, UNPCKLPD

adatok keveréseSHUFPS – 2-2 tetszőleges operandust helyez

el a két forrás regiszterből a cél regiszterbeSHUFPD – 1-1 tetszőleges operandust helyez

el a két forrás regiszterből a cél regiszterbe

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

50SSE példa – Kitömörítés-betömörítés 1

__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

punpckhwd xmm3, xmm0

punpcklwd xmm2, xmm0

movdqu b, xmm3

movdqu c, xmm2

packssdw xmm2, xmm3

movdqu d, xmm2}

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

51SSE példa – Kitömörítés-betömörítés 2

...DEMO...

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

52SSE/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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

53SSE/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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

54SSE/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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

55SSE 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) BALk,JOBBk,BALk+1,JOBBk+1,BALk+2,JOBBk+2,...

minta (sample) értékek 0 – hangtalan -32768, +32767 – 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á

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

56SSE példa – Hangerősség 2

// get volume factor 0 – 1024fact := tckAmplify.Position; for i := start to stop dobegin // amplify left channel temp := Wave.Buffer[2*i]; temp := (temp*fact) div 512; if (temp < -32768) then Wave.Buffer[2*i] := -32768 else if (temp > +32767) then Wave.Buffer[2*i] := +32767 else Wave.Buffer[2*i] := temp;...

... // amplify right channel temp := Wave.Buffer[2*i+1]; temp := (temp*fact) div 512; if (temp < -32768) then Wave.Buffer[2*i+1] := -32768 else if (temp > +32767) then Wave.Buffer[2*i+1] := +32767 else Wave.Buffer[2*i+1] := temp;end;

x0 – x2 hangerő skála → 0 – 1024 0 – x0 hangerő 512 – x1 hangerő 1024 – x2 hangerő

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

57SSE 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 samples@again: // 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 jb @againend;

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

58SSE példa – Hangerősség 4

...DEMO...

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

59

Köszönöm a figyelmet!

top related