MMX assembly programozás

Slides:



Advertisements
Hasonló előadás
„Esélyteremtés és értékalakulás” Konferencia Megyeháza Kaposvár, 2009
Advertisements

1 Számítógépek felépítése 9. előadás I/O rendszerek.
Összefoglalás 1. Pascal program szerkezete 2. Pascal típusai
Számítógépek felépítése 3. előadás CPU, utasítás ciklus, címzés
Számítógép architektúra
2009 Bevezetés a programozásba Krankovits Melinda.
Koordináta transzformációk
Koordináta transzformációk
Analitikus (koordináta) geometriai gyorstalpaló
Szerkezeti leírás Összetevők és beültetésük Összetevők és beültetésük Általános kiosztás (generic map) Általános kiosztás (generic map) Generate parancs.
 Többszálúság  Gyártási költségek  A modellnevek megváltoztatása  Processzor magok  Athlon és Phenom összehasonlítása.
JavaScript.
Turbo Pascal Változók.
Alhálózat számítás Osztályok Kezdő Kezdete Vége Alapértelmezett CIDR bitek alhálózati maszk megfelelője A /8 B
11. előadás (2005. május 10.) A make segédprogram Alacsony szintű műveletek és bitmezők Fájl, katalógus rendszer hívások 1.
4. előadás (2005. március 8.) Pointerek Pointer aritmetika
Nat Pedellus Informatika 8. osztály óra.
Készítette: Rummel Szabolcs Elérhetőség:
A számítógéprendszer.
Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő:
6. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.
Számítógépek felépítése 4. előadás ALU megvalósítása, vezérlő egység
6. Előadás Merevítő rendszerek típusok, szerepük a tervezésben
Darupályák tervezésének alapjai
A PLC-s vezérlés előnyei és alkalmazásai (Mitsubishi)
Egy harmadik generációs gép (az IBM 360) felépítése
PHP I. Alapok. Mi a PHP? PHP Hypertext Preprocessor Szkriptnyelv –Egyszerű, gyors fejlesztés –Nincs fordítás (csak értelmező) Alkalmazási lehetőségek:
Fixpontos, lebegőpontos
dr. Szalkai István Pannon Egyetem, Veszprém
Címzési módok, utasítások a CPU-ban Címértelmezés műv. kódadat műv. kód 0 1 cím adat cím adat közvetlen (immediat) adatmegadás rejtett (inheritent),
Számítógép architektúra Címzésmódok. 2007Címzésmódok2-21 Operandusok egy operandus hossza lehet: –1 byte –2 byte (szó) –4 byte egy operandus lehet: –az.
Számítógép architektúra
Alkalmazások és operációs rendszerek optimizálása „Babeş-Bolyai” Tudományegyetem, Matematika-Informatika Kar Forráskód szintű optimizálások C-ben Assembly.
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.
Exponenciális egyenletek
Programozási Nyelvek (C++) Gyakorlat Gyak 02.
Programozási nyelvek Páll Boglárka.
Mikrokontroller (MCU, mikroC)
Tömbök és programozási tételek
Kétdimenziós tömbök Mátrixok
Programozási nyelvek.
Készítette: Csíki Gyula
Analitikus geometria gyorstalpaló
Processzorok.
Egy második generációs gép (az IBM 7094) felépítése
Egy első generációs gép (az IAS) felépítése
Objektum orientált programozás
A Visual Basic nyelvi elemei
Mikroprocesszor.
Török Katalin és Marosi Nóra 11/c. Pascal: Az es években megjelent magas szintű programozási nyelv, közel áll az emberi gondolkodáshoz. Nevét.
Nat Pedellus Free Pascal Elágazások..
1 Szervetlen és Analitikai Kémia Tanszék, Kémiai Informatika Csoport Számítástechnika Kari rendszergazda: Rippel Endre (Ch C2)
BIOLÓGUS INFORMATIKA 2008 – 2009 (1. évfolyam/1.félév) 3. Előadás.
Írja fel a tizes számrendszerbeli
Free pascal feladatok
Algoritmizálás, adatmodellezés
I/O terület és I/O allokáció Áttekintés A CPU egység beépített, általános felhasználású I/O –inak kiosztása A CP1H Y CPU egység allokációja.
Mikroprocesszorok (Microprocessors, CPU-s)
1 Mivel foglalkoz(t)unk a laborokon? 1.Labor: Word alapok Excel alapok: Excel alapok: Cellahivatkozás, munkalapfüggvény, diagram varázsló, trendvonal 2.
HEFOP 3.3.1–P /1.0A projekt az Európai Unió társfinanszírozásával, az Európa terv keretében valósul meg. 1 Számítógép architektúrák dr. Kovács.
Excel programozás (makró)
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás I. 3. gyakorlat.
Számítógépek felépítése 4. előadás ALU megvalósítása, vezérlő egység
1 Mivel foglalkoz(t)unk a laborokon? 1.Labor: Word alapok Excel alapok: Excel alapok: Cellahivatkozás, munkalapfüggvény, diagram varázsló, trendvonal 2.
A CPU (központi feldolgozó egység vagy processzor)
Excel programozás (makró)
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
A számítógép működésének alapjai
Pipeline példák (IMSC, 2019).
Előadás másolata:

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 2006

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

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 2006

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 2006

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 2006

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

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

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 2006

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 2006

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 2006

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 2006

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 2006

MMX – Aritmetikai utasítások 2 szorzás – PMULLW, PMULHW szorzás-összeadás – PMADDWD SRC X3 X2 X1 X0 DEST Y3 Y2 Y1 Y0 TEMP Z3=X3*Y3 Z2=X2*Y2 Z1=X1*Y1 Z0=X0*Y0 PMULLW - DEST Z3[15-0] Z2[15-0] Z1[15-0] Z0[15-0] PMULHW - DEST Z3[31-16] Z2[31-16] Z1[31-16] Z0[31-16] PMADDWD - DEST Z3 + Z2 Z1 + Z0 BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

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; function Stop: Int64; StopTime := RDTSC; Result := StopTime - StartTime; 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; ... BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

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

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

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

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 2006

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

MMX – Összehasonlító utasítások 2 __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); 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 BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

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 D2 C2 B2 A2 PACKSSDW DEST,SRC BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

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 2006

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 PUNPCKLWD DEST,SRC DEST B1 B2 A1 A2 SRC D1 C1 B1 A1 DEST D2 C2 B2 A2 DEST D1 D2 C1 C2 PUNPCKHWD DEST,SRC BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

MMX – Shift utasítások logikai eltolás balra logikai eltolás jobbra 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 2006

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

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 2006

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 2006

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 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 line[i].g := 255; if line[i].b < 250 then line[i].b := line[i].b + 5 line[i].b := 255; end; Result := Stop; BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

MMX példa – Képek fényessége 3, hibás 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; 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; BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

MMX példa – Képek fényessége 3 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; 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; BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

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

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