SIMD
description
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