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

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

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

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

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

10 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 10 MMX 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 suffixek B, W, D – adattípus suffixek a legtöbb útasítás a P prefixel kezdődik

11 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 11 MMX – 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állapotot a 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

12 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 12 MMX – Adatátiveli utasítások MOVD – skaláris 32 bites adatmozgatás reg/m32, mmx 0-31 mmx 0-31, reg/m32 ← a felső 32 bit lenullázódik használható általános regiszterekkel MOVQ – vektoriális 64 bites adatmozgatás mmx/m64, mmx mmx, mmx/m64 NEM használható általános regiszterekkel

13 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 13 MMX – Aritmetikai utasítások 1 összeadás PADDB, PADDW, PADDD PADDSB, PADDSW PADDUSB, PASSUSW kívonás PSUBB, PSUBW, PSUBD PSUBSB, PSUBSW PSUBUSB, PSUBUSW

14 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 14 MMX – Aritmetikai utasítások 2 szorzás – PMULLW, PMULHW szorzás-összeadás – PMADDWD X3X2X1X0Y3Y2Y1Y0Z3=X3*Y3 Z2=X2*Y2Z1=X1*Y1Z0=X0*Y0Z3[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 + Z2Z1 + Z0 PMADDWD - DEST

15 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 15 MMX 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 TWordVector = array [0..N-1] of Word; var a1, b1, c1: TWordVector; a2, b2, c2: TWordVector; i: Integer;...

16 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 16 MMX 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);...

17 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 17 MMX 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, pop edx pop edi pop esi push esi push edi push edx mov ecx, N shr ecx, movq mm0, [edi] movq mm0, [edi] movq mm1, [esi] movq mm1, [esi] pmullw mm0, mm1 pmullw mm0, mm1 movq [edx], mm0 movq [edx], mm0 add edi, 8 add esi, 8 add edx, 8 sub ecx, 1 sub eax, 1 emms end;

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

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

20 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 20 MMX – Ö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

21 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 21 MMX – Ö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 0x B0AFF4433 0x0A0A0A0A0A0A0A0A 0x B __int64 a, b, limit; a = 0x B0AFF4433; 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);

22 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 22 MMX – 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 D2C2B2A2 B1D1A1C1 DESTSRC DEST PACKSSDW DEST,SRC

23 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 23 MMX – Kitömörítő utasítások 1 rangosabb fél kitömörítése PUNPCKHBW – 2 x 4 x 8 bit → 1 x 8 x 8 bit PUNPCKHWD – 2 x 2 x 16 bit → 1 x 4 x 16 bit PUNPCKHDQ – 2 x 1 x 32 bit → 1 x 2 x 32 bit kevésbé rangos fél kitömörítése PUNPCKLBW, 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

24 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 24 MMX – 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 D1C1B1A1 SRC D2C2B2A2 DEST B1B2A1A2 DEST D1D2C1C2 DEST PUNPCKLWD DEST,SRC PUNPCKHWD DEST,SRC

25 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 25 MMX – 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 !!!

26 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

27 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 ( ) PREFETCHNTA, PREFETCHT0, PREFETCHT1, PREFETCHT2, MOVNTQ, SFENCE PSADBW

28 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 28 MMX példa – Képek fényessége 1 RGB, 32 bit / pixel BITMAP képek az 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

29 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 29 MMX 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; Result := Stop;... end;

30 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 30 MMX példa – Képek fényessége 3, hibás asm mov edx, line mov eax, 0 mov ecx, width movq mm0, movq mm1, [edx + 4*eax] paddusb mm1, mm0 movq [edx + 4*eax], mm1 inc eax end; asm mov eax, line mov ecx, width shr ecx, 2 movq mm0, delta // 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 end;

31 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 31 MMX példa – Képek fényessége 3 asm mov edx, line mov eax, 0 mov ecx, width shr ecx, 1 movq mm0, movq mm1, [edx + 8*eax] paddusb mm1, mm0 movq [edx + 8*eax], mm1 inc eax end; delta=$ ; asm mov eax, line mov ecx, width shr ecx, 3 movq mm0, 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 end;

32 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 32 MMX példa – Képek fényessége 4...DEMO...

33 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 33 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 MMX assembly programozás előadás dr. Robu."

Hasonló előadás


Google Hirdetések