330 likes | 469 Views
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
E N D
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 • 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 BBTE, Alkalmazások és operációs rendszerek optimizálása
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 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
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
MMX regiszterszett BBTE, Alkalmazások és operációs rendszerek optimizálása
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ásmmreg1,mmreg2/mem64 formájú BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
MMX – Adatátiveli utasítások • MOVD – skaláris 32 bites adatmozgatás • reg/m32, mmx0-31 • mmx0-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 BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
Z3[15-0] Z3[31-16] X3 Y3 Z3=X3*Y3 Z2=X2*Y2 Z2[15-0] Y2 Z2[31-16] X2 Z1[15-0] Z1[31-16] Z1=X1*Y1 Y1 X1 Z0[31-16] Y0 Z0=X0*Y0 X0 Z0[15-0] MMX – Aritmetikai utasítások 2 • szorzás – PMULLW, PMULHW • szorzás-összeadás – PMADDWD SRC DEST TEMP PMULLW - DEST PMULHW - DEST PMADDWD - DEST Z3 + Z2 Z1 + Z0 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 TWordVector = array [0..N-1] of Word; var a1, b1, c1: TWordVector; a2, b2, c2: TWordVector; i: Integer; ... MMX példa – Vektor szorzás 1 BBTE, Alkalmazások és operációs rendszerek optimizálása
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); ... MMX példa – Vektor szorzás 2 BBTE, Alkalmazások és operációs rendszerek optimizálása
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 mm1, [esi] pmullw mm0, mm1 movq [edx], mm0 add edi, 8 add esi, 8 add edx, 8 sub ecx, 1 jnz @next sub eax, 1 jnz @next2 ... emms end; MMX példa – Vektor szorzás 3 BBTE, Alkalmazások és operációs rendszerek optimizálása
MMX példa – Vektor szorzás 4 ...DEMO... BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
MMX – Összehasonlító utasítások 1 • egyenlőség vizsgálata • PCMPEQB, PCMPEQW, PCMPEQD • nagyobb-mint vizsgálata • PCMPGTPB, PCMPGTPW, PCMPGTPD • műveletdestmmx,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 BBTE, Alkalmazások és operációs rendszerek optimizálása
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); MMX – Összehasonlító utasítások 2 BBTE, Alkalmazások és operációs rendszerek optimizálása
D2 C2 B2 A2 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 SRC D1 C1 DEST B1 A1 DEST PACKSSDW DEST,SRC BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
D1 D1 D2 D2 C1 C2 B2 C1 B1 A1 C2 A2 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 PUNPCKLWDDEST,SRC DEST B1 B2 A1 A2 SRC DEST DEST PUNPCKHWDDEST,SRC BBTE, Alkalmazások és operációs rendszerek optimizálása
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 !!! BBTE, Alkalmazások és operációs rendszerek optimizálása
SSE utasítás-szett bővítések MMX-es egész műveletek számára 1 • MASKMOVQmmx1,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) >> 1bá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 BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
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; MMX példa – Képek fényessége 2 BBTE, Alkalmazások és operációs rendszerek optimizálása
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; MMX példa – Képek fényessége 3, hibás BBTE, Alkalmazások és operációs rendszerek optimizálása
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; MMX példa – Képek fényessége 3 BBTE, Alkalmazások és operációs rendszerek optimizálása
MMX példa – Képek fényessége 4 ...DEMO... BBTE, Alkalmazások és operációs rendszerek optimizálása
Köszönöm a figyelmet! BBTE, Alkalmazások és operációs rendszerek optimizálása