SIMD

39
SIMD Single Instruction Multiple Data Piotr Dałek

description

SIMD. Single Instruction Multiple Data. Piotr Dałek. Motywacja. Złożone przetwarzanie dużej ilości danych Dużo kodu Głodzone segmenty procesorów Coraz większe wymagania względem jakości treści Marketing i wojny rynkowe. Dużo kodu. Pascal:. Dużo kodu. - PowerPoint PPT Presentation

Transcript of SIMD

SIMD

SIMDSingle Instruction Multiple DataPiotr DaekMotywacjaZoone przetwarzanie duej iloci danychDuo koduGodzone segmenty procesorwCoraz wiksze wymagania wzgldem jakoci treciMarketing i wojny rynkowe

Duo koduPascal:

Duo koduainUnit.pas.152: destvtx.x := ((srcvtx.x*(transmat^)[0]) + (srcvtx.y * (transmat^)[1]) + (srcvtx.z * (transmat^)[2]));00453A2E D906 fld dword ptr [esi]00453A30 D808 fmul dword ptr [eax]00453A32 D94604 fld dword ptr [esi+$04]00453A35 D84804 fmul dword ptr [eax+$04]00453A38 DEC1 faddp st(1)00453A3A D94608 fld dword ptr [esi+$08]00453A3D D84808 fmul dword ptr [eax+$08]00453A40 DEC1 faddp st(1)00453A42 D91B fstp dword ptr [ebx]00453A44 9B wait MainUnit.pas.153: destvtx.y := ((srcvtx.x*transmat^[4]) + (srcvtx.y * transmat^[5]) + (srcvtx.z * transmat^[6]));00453A45 D906 fld dword ptr [esi]00453A47 D84810 fmul dword ptr [eax+$10]00453A4A D94604 fld dword ptr [esi+$04]00453A4D D84814 fmul dword ptr [eax+$14]00453A50 DEC1 faddp st(1)00453A52 D94608 fld dword ptr [esi+$08]00453A55 D84818 fmul dword ptr [eax+$18]00453A58 DEC1 faddp st(1)00453A5A D95B04 fstp dword ptr [ebx+$04]00453A5D 9B wait MainUnit.pas.154: destvtx.z := ((srcvtx.x*transmat^[8]) + (srcvtx.y * transmat^[9]) + (srcvtx.z * transmat^[10])) + 400;00453A5E D906 fld dword ptr [esi]00453A60 D84820 fmul dword ptr [eax+$20]00453A63 D94604 fld dword ptr [esi+$04]00453A66 D84824 fmul dword ptr [eax+$24]00453A69 DEC1 faddp st(1)00453A6B D94608 fld dword ptr [esi+$08]00453A6E D84828 fmul dword ptr [eax+$28]00453A71 DEC1 faddp st(1)00453A73 D805043B4500 fadd dword ptr [$00453b04]00453A79 D95B08 fstp dword ptr [ebx+$08]00453A7C 9B wait []Zaledwie fragment!Duo kodu movups xmm0, [ecx] movups xmm1, [ecx+$10] movups xmm2, [ecx+$20]

@next: movups xmm4, [eax+esi] movups xmm5, xmm4 movups xmm6, xmm4

mulps xmm4, xmm0 movups [edx+esi], xmm4 mulps xmm5, xmm1 movups [edx+esi+$10], xmm5 fld [edx+esi] fadd [edx+esi+4] fadd [edx+esi+8] mulps xmm6, xmm2 movups [edx+esi+$20], xmm6 fstp [edx+esi] fld [edx+esi+16] fadd [edx+esi+20] fadd [edx+esi+24] fstp [edx+esi+4] fld [edx+esi+32] fadd [edx+esi+36] fadd [edx+esi+40] fadd [eax+esi+12] // srcvrt.zero fst [edx+esi+8]

fld xe fdiv st(0), st(1)

fld st(0) fmul [edx+esi] fstp [edx+esi] movups xmm4, [edx+esi] mulps xmm4, xmm4 movups [edi], xmm4

fld [edi] fadd [edi+4] fadd [edi+8] fstp [edi] add edi, 4 add esi, $10 jnz @next pop edi

mov esi, 196608*4 mov eax, maxmem add eax, esi neg esi movups xmm0, [eax+esi] sqrtps xmm1, xmm0 movups xmm1, [eax+esi] sqrtps xmm0, xmm1@nextmax: movups xmm2, [eax+esi] sqrtps xmm2,xmm2 maxps xmm0, xmm2 movups [eax+esi], xmm2 minps xmm1, xmm2 add esi, 16 jnz @nextmax mov eax, maxmem movups [eax], xmm0 movups [eax+16], xmm1Cao!Godzone segmenty procesoraXOR jako instrukcja prosta SIMDPotoki U oraz VNiewykorzystana przepustowo szynyHyperthreading jako automat do zwikszania utylizacji segmentw procesoraXOR - SIMDPerforms a bitwise exclusive OR (XOR) operation on the destination (first) and source (second) operands and stores the result in the destination operand location. The source operand can be an immediate, a register, or a memory location; the destination operand can be a register or a memory location. (However, two memory operands cannot be used in one instruction.) Each bit of the result is 1 if the corresponding bits of the operands are different; each bit is 0 if the corresponding bits are the same.This instruction can be used with a LOCK prefix to allow the instruction to be executed atomically.

XOR - SIMDOpcodeInstruction34 ibXOR AL, imm835 iwXOR AX, imm1635 idXOR EAX, imm32REX.W + 33 /rXOR r64, r/m64XOR - SIMDXOR EAX, EBXABCDXORWXYZEAXEBXA^WB^XC^YD^ZEAXXOR - SIMDSzyfrowanie 8-miobitowym kluczemSzyfrowanie po 8, 16 i 32 bity narazPtla warunkowa bez warunkuBase+Displacement

XOR - SIMDZawodnik #1: Pentium I (200MHz)8KB L1 Cache8bit ZZZzzZZZzzZzzzzzzzzzzz 477,40s16bit 310,35s = 1,53x32bit 268, 4 s = 1,77x32bit_4 268,4 s = 1,77xXOR - SIMDZawodnik #2: Atom 330 (1,6GHz, HT)24kB L1 Cache (x2, per rdze)8bit 101,6 s = 1x16bit 47,2 s = ~2,15x32bit 17,38 s = ~5,84x32bit_4 16,97 = ~5,98xXOR - SIMDZawodnik #3 - Core 2 Duo E4400 (2GHz + ovrclk 0,4GHz)64kB L1 cache (per rdze, 32kB instrukcje, 32kB dane)8bit 10,1 s = 1x16bit 7,75 s = ~1,30x32bit 7,50 s = ~1,34x32bit_4 7,30s = ~1,38xXOR - SIMDZawodnik #4 - Core i7 2660 (3,4GHz)64kB L1 cache (per rdze)8bit 9,44 s = 1x16bit 4,90 s = ~1,92x32bit 2,65 s = ~3,56x32bit_4 2,11 s = ~4,47xXOR - SIMDPami wskim gardem?16MB*1000/7,30 = 2191 MB/s = >2GB/sE4400 ma zaledwie 2 MB cache l2, wykluczamy palenie cacheDDR2/800 ma teoretyczn przepustowo 6,4GB/sDlaczego takie mae rnice dla C2d i takie gigantyczne dla Atoma 330 i Core i7?Potoki U i VPentium procesorem superskalarnymV na instrukcje prosteU na wszystkie instrukcjeInstrukcje w potoku U wykonuj si rwnolegle z instrukcjami z potoku VOut-of-order execution automatyzuje to

Niewykorzystana przepustowo2,1GB < 6,4GBFPU jako akcelerator kopiowania pamici8 bajtw > 4 bajtyDobre rozwizanie nie zawsze brzmi rozsdnie ;)@@Loop: fild qword ptr [eax+ecx] fistp qword ptr [edx+ecx] add ecx, 8 jl @@Loop

Rosnce wymaganiaDoom: 320x200x8bpp

Rosnce wymaganiaGLQuake: WOOO SVGA!!!1111oneoneoneeleven(640x480x16bpp)

Rosnce wymaganiaSupreme Commander - dwa monitory (1680x1050 + 1024x768), pene 3D

MMXMultiMedia eXtensions1997 rokNikt nie by na to przygotowany, WIEEELKI zawd ze strony WintelaEMMSMMX

MMX na przykadzie PADDBEFGHPACKED ADD BYTESWXYZMM0MM1E+WF+XG+YH+ZMM0ABCDSTUVA+SB+TC+UD+VMMX na przykadzie PADDBJedna instrukcja rwnowana omioprzebiegowej ptli albo 16 instrukcjomProblem iloci danych nie wyrwnane do paczek MMXMMX kolejny przykadUnicodeDwa bajty na znakASCII to podzbir UnicodeKompresja 50% bez strat!Przeple znaki zeramiWersja MMX 4x szybsza ni x86Oszczdno miejsca bez wyranej straty wydajnoci

Wikipedia - weryfikacja adresu e-mailP.i.o.t.r. .D.a.Be.k.MMX kolejny przykadpxor mm0, mm0@next:movq mm1, [eax ]movq mm2, [eax+8]add eax, 16packuswb mm1, mm2movq [edx], mm1add edx, 8cmp eax, ecxjne @nextemms@nextslow:pop ecxcmp ecx, eaxjbe @sret@nextsl:mov bl, [eax]mov [edx], bladd eax, 2add edx, 1cmp ecx, eaxjne @nextsl@sret:pop ebx@qret:

pxor mm0, mm0@next:movd mm1, [eax]movd mm2, [eax+4]punpcklbw mm1, mm0punpcklbw mm2, mm0movq [edx ], mm1movq [edx+8 ], mm2add eax, 8add edx, 16cmp eax, ecxjb @nextemms3DNowMMX nie zapewniao instrukcji obsugujcych wektory zmiennoprzecinkowePole do popisu dla AMD, prba monopolizowania rynkuIntel oczywicie tego nie wspieraNiedawno si z tego cakowicie wycofali, wic odmy to do lamusaPereki: FEMMS, PREFETCH/PREFETCHW, operacje horyzontalne (Intel pi a do SSE3)SSEStreaming SIMD ExtensionsOdpowied Intela na 3DNowSzereg nowych instrukcji, nowe rejestry (XMMx)MOVUPS, MOVAPS, i nie rozumiem czemu *TU* mam GPFy!Przykadowy programSSE2128-bitowe typy danychDUO instrukcji do zabawy z wektorami zmiennoprzecinkowymiInstrukcje do hurtowej konwersji Single/Double/IntKontrola nad CacheCFLUSHMOVNTI, MOVNTDQ, MOVNTPDPauseSSE3Dziaanie w poziomieHSUBPS, HADDPS, HADDPD, HSUBPDMONITOR, MWAITZwikszenie wydajnoci przy dostpie na skraju linii pamici cacheLDDQUDuplikacja elementwMOVSHDUP, MOVSLDUP, MOVDDUPAES-NIIntel pozazdroci VIA ichniego Padlock EngineNowe instrukcje zapewniajce sprztowe szyfrowanie AES:AESDEC, AESDECLAST, AESENC, AESENCLAST, AESIMC, AESKEYGENASSIST.AVXAdvanced Vector Extensions256-bitowe typy danychWysza szkoa jazdy ;)

Problemy z SIMDNiebanalneOptymalny ukad danych nie jest optymalny w rozumieniuX1Y1Z100X0Y0Z000Y0Y1Y2Y3X0X1X2X3Problemy z SIMDWymagane dokadne rozumienie, co i jak dziaaTrik z ptl bez cmp to chleb powszedniWymaga duo czasu programistyRne wsparcie dla rnych instrukcji i konieczno radzenia sobie z rnymi konfiguracjami Mam SSE, ale nie mam HADDPS, bo to jest dopiero w SSE3Uywam recznej serii FADD(P) albo tak organizuj dane, bym mg uy ADDPSPrzykadowa aplikacjaObraz na powierzchniWcale nie texture-mapping

Przykadowa aplikacjaDelphi 7, natywny kodWersja z przelicznikiem dziaajcym po FPUWersja SSEWersja CUDA (w trakcie)C#, p-c0deASM niedopuszczalny (zasadniczo)Wskaniki s beNie oczekujmy cudwWynikiZawodnikx86SSEC#Pentium 2000,5-1FPSEE C000001DBrak .net FrameworkAtom 330~10FPS~13 FPS~6,5fpsCore 2 Duo E4400~38FPS~45FPS~22FPSCore i7 2600~95FPS~153FPS~49FPSKonkluzjeKod SSE sabo zoptymalizowanyUycie HADDPS albo reorganizacja elementw wektorw zapewne poprawiaby wydajnoWynik, jak na pierwszy raz, zadowalajcyDuy potencja lecy w instrukcjach SSE ktry nie jest atwy w wykorzystaniuZabawa dla kombinatorw

Wsparcie mechaniczno-merytoryczneIntrinsiceWszdzieAutomatyczna wektoryzacja (GCC, ICC, MSVC?)ICC drogi i wrednyUdowodniono, e wygenerowany kod degraduje si na procesorach AMDvTune i inne wynalazkiDokumentacja Intela