mmx assembly programozás

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

Upload: cili

Post on 31-Jan-2016

28 views

Category:

Documents


0 download

DESCRIPTION

MMX assembly programozás. 6. előadás dr. Robu Judit szeminárium drd. Lukács Sándor. 2006. Bevezető. 1996-ban jelent meg az Intel Pentium MMX MMX = Multi Media eXtensions elsősorban gyorsabb audio és video adat-feldolgozást tett lehetővé → MP3, MPEG video - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: MMX assembly  programozás

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

„Babeş-Bolyai” Tudományegyetem, Matematika-Informatika Kar

MMX assembly programozás

előadás

dr. Robu Juditszeminárium

drd. Lukács Sándor

6

2006

Page 2: MMX assembly  programozás

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

2Bevezető

1996-ban jelent meg az Intel Pentium MMX MMX = Multi Media eXtensions elsősorban gyorsabb audio és video adat-feldolgozást

tett lehetővé → MP3, MPEG video más területeken is könnyen használható

pl. adattömörítés, képfeldolgozás egész számokkal (integer) végez műveleteket tipikusan x3 – x4-es sebesség növekedés érhető el

Page 3: MMX assembly  programozás

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

3MMX 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

Page 4: MMX assembly  programozás

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)

Page 5: MMX assembly  programozás

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

Page 6: MMX assembly  programozás

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

6MMX végrehajtási környezet

az általános regiszterekkel végezzük a memória címzését

egyes MMX utasítások esetén az általános regiszterek oprandusként is jelen vannak

az MMX regiszterek az x87-es regiszter területet használják vagy MMX, vagy x87-es FPU

Page 7: MMX assembly  programozás

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

7MMX regiszterszett

Page 8: MMX assembly  programozás

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

8MMX adattípusok

három új, hardveresen támogatott adattípus 64 bitre tömörített bájt egészek 64 bitre tömörített szó egészek 64 bitre tömörített duplaszó egészek mindenik típus lehet előjeles és előjel nélküli

új utasítások az MMX regiszterekkel és memóriában lévő operandusokkal végzedő műveletek számára

a legtöbb utasítás mmreg1,mmreg2/mem64 formájú

Page 9: MMX assembly  programozás

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

9Túlcsordulás vezérlés

túlcsordulásos (wraparound) mint a processzor általános regisztereivel végzett aritmetikai

műveletek esetén előjeles korlátozás (signed saturation) előjel nélküli korlátozás (unsigned saturation) egy esetleges túlcsordulás NINCS jelezve sem kivétellel, sem

EFLAGS-ben beállított bitekkel

Page 10: MMX assembly  programozás

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

10MMX utasítások – Bevezető

a legtöbb utasítás külön-külön jelen van mind a három adattípus és két-három túlcsordulás vezérlés számára

az útasítások nevében suffixekkel van jelölve a kiválasztott adattípus és túlcsordulás–, S, US – túlcsordulás suffixekB, W, D – adattípus suffixek

a legtöbb útasítás a P prefixel kezdődik

Page 11: MMX assembly  programozás

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

11MMX – Inicializálás, EMMS

amikor bármely MMX utasítást végrehajtjuk automatikusan inicializálódik az MMX állapot (átvált FPU x87-ről MMX-re)x87-es FPU Tag 00-ra állítódik (VALID)a TOS (Top Of Stack) mindig 000-ra vált

EMMS – törli az MMX adatállapotota x87-es FPU Tag 11-re állítódik (EMPTY)mindig kötelezően meg kell hívni, mielőtt

átváltanánk MMX-ről x87-es FPU-ra

Page 12: MMX assembly  programozás

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

12MMX – Adatátiveli utasítások

MOVD – skaláris 32 bites adatmozgatásreg/m32, mmx0-31

mmx0-31, reg/m32 ← a felső 32 bit lenullázódikhasználható általános regiszterekkel

MOVQ – vektoriális 64 bites adatmozgatásmmx/m64, mmxmmx, mmx/m64NEM használható általános regiszterekkel

Page 13: MMX assembly  programozás

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

13MMX – Aritmetikai utasítások 1

összeadásPADDB, PADDW, PADDDPADDSB, PADDSWPADDUSB, PASSUSW

kívonásPSUBB, PSUBW, PSUBDPSUBSB, PSUBSWPSUBUSB, PSUBUSW

Page 14: MMX assembly  programozás

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

14MMX – Aritmetikai utasítások 2

szorzás – PMULLW, PMULHW szorzás-összeadás – PMADDWD

X3 X2 X1 X0

Y3 Y2 Y1 Y0

Z3=X3*Y3 Z2=X2*Y2 Z1=X1*Y1 Z0=X0*Y0

Z3[15-0] Z2[15-0] Z1[15-0] Z0[15-0]

SRC

DEST

TEMP

PMULLW - DEST

Z3[31-16] Z2[31-16] Z1[31-16] Z0[31-16]PMULHW - DEST

Z3 + Z2 Z1 + Z0PMADDWD - DEST

Page 15: MMX assembly  programozás

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

15MMX 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 TWordVector = array [0..N-1]

of Word;

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

...

Page 16: MMX assembly  programozás

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

16MMX példa – Vektor szorzás 2

function CpuMulVector(var a, b, c: TWordVector;

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, CPU-val történő szorzás

... for i := 0 to N-1 do begin a1[i] := Random(256); b1[i] := Random(256); a2[i] := a1[i]; b2[i] := b1[i]; end;

cpu := CpuMulVector(a1, b1, c1, N); mmx := MmxMulVector(a2, b2, c2, N);

writeln('cpu = ', cpu, ' ticks'); writeln('mmx = ', mmx, ' ticks'); writeln(' x = ', cpu/mmx:5:3);...

Page 17: MMX assembly  programozás

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

17MMX példa – Vektor szorzás 3

function MmxMulVector(var a, b, c: TWordVector; 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:

movq mm0, [edi]movq mm0, [edi] movq mm1, [esi]movq mm1, [esi] pmullw mm0, mm1pmullw mm0, mm1 movq [edx], mm0movq [edx], mm0 add edi, 8 add esi, 8 add edx, 8 sub ecx, 1 jnz @next sub eax, 1 jnz @next2... emmsend;

Page 18: MMX assembly  programozás

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

18MMX példa – Vektor szorzás 4

...DEMO...

Page 19: MMX assembly  programozás

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

19MMX – Logikai utasítások

bitenként hajtódnak végre 64 biten

PAND – DEST ← DEST AND SRC PANDN – DEST ← (NOT DEST) AND SRC POR – DEST ← DEST OR SRC PXOR – DEST ← DEST XOR SRC

Page 20: MMX assembly  programozás

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

20MMX – Összehasonlító utasítások 1

egyenlőség vizsgálata PCMPEQB, PCMPEQW, PCMPEQD

nagyobb-mint vizsgálata PCMPGTPB, PCMPGTPW, PCMPGTPD művelet destmmx,mmx/m64

bájtonkénti, szavankénti, dupla-szavankénti összehasonlítás ha a cél regiszter > forrás operandus (illetve ha egyenlő) akkor a cél

regiszter megfelelő bájtja / szava / dupla-szava 0xFF / 0xFFFF / 0xFFFFFFFF lessz, különben 0

a műveletek előjeles összehasonlítást végeznek NEM módosítják az EFLAGS jelzőbitjeit a logikai utasításokkal együtt jól használhatók feltételes

adatmozgatásokra

Page 21: MMX assembly  programozás

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

21MMX – Összehasonlító utasítások 2

pl. csak a 10-nél nagyobb bájtokat őrizzük meg, a többit nullázzuk egy 64 bites operandusból

0x0105090B0AFF4433 0x0A0A0A0A0A0A0A0A 0x0000000B00004433

__int64 a, b, limit;

a = 0x0105090B0AFF4433;limit = 0x0A0A0A0A0A0A0A0A;b = 0xFFFFFFFFFFFFFFFF;

__asm{ movq mm0, a movq mm1, mm0 pcmpgtb mm1, limit pand mm0, mm1 movq b, mm0 emms}

printf("0x%016I64X\n", a);printf("0x%016I64X\n", limit);printf("0x%016I64X\n", b);

Page 22: MMX assembly  programozás

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

22MMX – Betömörítő utasítások

PACKSSWB – 2 x 4 x 16 bit → 1 x 8 x 8 bit PACKSSDW – 2 x 2 x 32 bit → 1 x 4 x 16 bit

túlcsordulás esetén maximális / minimális előjeles értékek kerülnek a célregiszterbe (pl. 0x7FFF)

PACKUSWB – 2 x 4 x 16 bit → 1 x 8 x 8 bit mint a PACKSSWB, csak előjel nélküli tömörítés

D2 C2 B2 A2

B1D1 A1C1 DESTSRC

DESTPACKSSDW DEST,SRC

Page 23: MMX assembly  programozás

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

23MMX – Kitömörítő utasítások 1

rangosabb fél kitömörítésePUNPCKHBW – 2 x 4 x 8 bit → 1 x 8 x 8 bitPUNPCKHWD – 2 x 2 x 16 bit → 1 x 4 x 16 bitPUNPCKHDQ – 2 x 1 x 32 bit → 1 x 2 x 32 bit

kevésbé rangos fél kitömörítésePUNPCKLBW, PUNPCKLWD, PUNPCKLDQ

a kitömörítés során a cél regiszterbe felváltva kerül egy-egy elem a két forrásoperandusból

Page 24: MMX assembly  programozás

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

24MMX – Kitömörítő utasítások 2

PUNPCKLWD – 2 x 2 x 16 bit → 1 x 4 x 16 bit PUNPCKHWD – 2 x 2 x 16 bit → 1 x 4 x 16 bit

D1 C1 B1 A1SRC D2 C2 B2 A2DEST

B1 B2 A1 A2DEST

D1 D2 C1 C2DEST

PUNPCKLWD DEST,SRC

PUNPCKHWD DEST,SRC

Page 25: MMX assembly  programozás

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

25MMX – Shift utasítások

logikai eltolás balra PSLLW, PSLLD,

PSLLQ mmx,imm8 logikai eltolás jobbra

PSRLW, PSRLD, PSRLQ mmx,imm8

aritmetikai eltolás jobbra PSRAW, PSRAD

mmx,imm8 előjeles kiegészítés !!!

Page 26: MMX assembly  programozás

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

26

SSE utasítás-szett bővítések MMX-es egész műveletek számára 1

MASKMOVQ mmx1,mmx2 – feltételes másolás a memóriába DS:[EDI] ← mmx1 azon bájtjai, amelyek esetén az mmx2-ben lévő

megfelelő bájt legrangosabb bit 1 PAVGB, PAVGW mmx1,mmx2 – átlagszámítás előjel nélkül

mmx1 ← (mmx1 + mmx2 + 1) >> 1 bájtonként / szavanként PEXTRW r32,mmx,imm8 – szó kimásolása általános regiszterbe PINSRW mmx,r32,imm8 – szó bemásolása általános regiszterből PMAXSW, PMINSW – maximum / minimum előjelesen, szavanként PMAXUB, PMINUB – maximum / minimum előjel nélkül, bájtonként PMOVMSKB r32,mmx – előjelbitmaszk készítése

minden bájt legrangosabb bitjét egymás után r32-nak a legkevésbé rangos bájtába helyezi el

Page 27: MMX assembly  programozás

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

27

SSE utasítás-szett bővítések MMX-es egész műveletek számára 2

PMULHUW – mint PMULHW, csak előjel nélküli szorzás PSHUFW xmm1,xmm2/m64,imm8 – szavankénti keverés

imm8 két-két bitje határozza meg, hogy melyik szó kerül az xmm1 megfelelő poziciójára xmm2/m64-ből

pl. pshufw mm0,mm1,0x1B ← tükörkép (00.01.10.11) PREFETCHNTA, PREFETCHT0, PREFETCHT1,

PREFETCHT2, MOVNTQ, SFENCE PSADBW

Page 28: MMX assembly  programozás

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

28MMX példa – Képek fényessége 1

RGB, 32 bit / pixel BITMAP képekaz adatok felosztása ideális tömörített bájtok

feldolgozására fényerő módosítása

+ r,g,b → fényesebb kép– r,g,b → sötétebb kép

Page 29: MMX assembly  programozás

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

29MMX példa – Képek fényessége 2

type TRGB32Vector = array[0..0] of packed record b,g,r,null:Byte; end; PRGB32Vector = ^TRGB32Vector;

function IncBright(Image): Int64;var i, j: Integer; line: PRGB32Vector;begin ... Start; for j := 0 to Height-1 do begin line := Bitmap.ScanLine[j]; for i := 0 to Width-1 do

... begin if line[i].r < 250 then line[i].r := line[i].r + 5 else line[i].r := 255; if line[i].g < 250 then line[i].g := line[i].g + 5 else line[i].g := 255; if line[i].b < 250 then line[i].b := line[i].b + 5 else line[i].b := 255; end; end; Result := Stop; ...end;

Page 30: MMX assembly  programozás

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

30MMX példa – Képek fényessége 3, hibás

asm mov edx, line mov eax, 0 mov ecx, width movq mm0, delta @next: movq mm1, [edx + 4*eax] paddusb mm1, mm0 movq [edx + 4*eax], mm1 inc eax loop @next end;

asm mov eax, line mov ecx, width shr ecx, 2 movq mm0, delta // 0x00050505 @next: movq mm1, [eax] movq mm2, [eax + 4] movq mm3, [eax + 8] movq mm4, [eax + 12] paddusb mm1, mm0 paddusb mm2, mm0 paddusb mm3, mm0 paddusb mm4, mm0 movq [eax], mm1 movq [eax + 4], mm2 movq [eax + 8], mm3 movq [eax + 12], mm4 add eax, 16 loop @next end;

Page 31: MMX assembly  programozás

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

31MMX példa – Képek fényessége 3

asm mov edx, line mov eax, 0 mov ecx, width shr ecx, 1 movq mm0, delta @next: movq mm1, [edx + 8*eax] paddusb mm1, mm0 movq [edx + 8*eax], mm1 inc eax loop @next end;

delta=$0005050500050505;

asm mov eax, line mov ecx, width shr ecx, 3 movq mm0, delta @next: movq mm1, [eax] movq mm2, [eax + 8] movq mm3, [eax + 16] movq mm4, [eax + 24] paddusb mm1, mm0 paddusb mm2, mm0 paddusb mm3, mm0 paddusb mm4, mm0 movq [eax], mm1 movq [eax + 8], mm2 movq [eax + 16], mm3 movq [eax + 24], mm4 add eax, 32 loop @next end;

Page 32: MMX assembly  programozás

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

32MMX példa – Képek fényessége 4

...DEMO...

Page 33: MMX assembly  programozás

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

33

Köszönöm a figyelmet!