OPTIMIZAÇÃO DE CÓDIGO PARA PENTIUM 4: SSE2 • Conceito de SIMD • Evolução das tecnologias • Aplicações práticas • Conclusões Luis Figueiredo - ESTG - Maio de 2003 CONCEITO DE SIMD Single Instruction, multiple data • Necessidades de uma nova tecnologia • Características dos dados a processar • Possíveis operações – Operações simples (aritméticas e lógicas) – Operações compostas (várias operações simples) Luis Figueiredo - ESTG - Maio de 2003 OPERAÇÕES SIMPLES + a0 a1 a2 a3 a4 a5 a6 a7 b0 b1 b2 b3 b4 b5 b6 b7 a0+b0 a1+b1 a2+b2 a3+b3 a4+b4 a5+b5 a6+b6 a7+b7 Luis Figueiredo - ESTG - Maio de 2003 OPERAÇÕES COMPOSTAS a0 a1 a2 a3 a4 a5 a6 a7 (ai+bi)/2 b0 b1 b2 b3 b4 b5 b6 b7 (a0 +b0)/2 (a7 +b7)/2 Luis Figueiredo - ESTG - Maio de 2003 OPERAÇÕES COMPOSTAS a0 a1 a2 a3 a4 a5 a6 a7 b0 b1 b2 b3 b4 b5 b6 b7 a0*b0+a1*b1 a2*b2+a3*b3 a4*b4+a5*b5 Luis Figueiredo - ESTG - Maio de 2003 a6*b6+a7*b7 CONCEITO DE SIMD Single Instruction, multiple data • Necessidades de uma nova tecnologia • Características dos dados a processar • Possíveis operações – Operações simples (aritméticas e lógicas) – Operações compostas (várias operações simples) • Operações com Saturação Luis Figueiredo - ESTG - Maio de 2003 OPERAÇÕES COM SATURAÇÃO Sem saturação 11111110 + 00000010 1 00000000 Com saturação 254 + 2 256 11111110 + 00000010 1 00000000 11111111 Erro Absoluto sem saturação 256 - 0 = 256 Erro Absoluto com saturação 256 - 255 = 1 Luis Figueiredo - ESTG - Maio de 2003 EVOLUÇÃO DAS TECNOLOGIAS • Tecnologia MMX (Pentium MMX) • Tecnologia SSE (Pentium III) • Tecnologia SSE2 (Pentium 4) Luis Figueiredo - ESTG - Maio de 2003 TECNOLOGIA MMX Aspectos físicos Registos da FPU st7 st6 st5 st4 st3 st2 st1 st0 Registos MMX MM7 MM6 MM5 MM4 MM3 MM2 MM1 MM0 80 bits 64 bits Luis Figueiredo - ESTG - Maio de 2003 TECNOLOGIA MMX Aspectos lógicos MMX (64 bits) QUADWORD DOUBLEWORD WORD WORD DOUBLEWORD WORD WORD Byte Byte Byte Byte Byte Byte Byte Byte Luis Figueiredo - ESTG - Maio de 2003 TECNOLOGIA MMX Algumas instruções • PADDB, PADDW, PADDD • PADDSB, PADDSW • PADDUSB, PADUSW • PSUBB, PSUBW, PSUBD • São 57 novas instruções Luis Figueiredo - ESTG - Maio de 2003 TECNOLOGIA MMX principais limitações • Não pode ser utilizada em simultâneo com a unidade de floating point (FPU) • Não permite qualquer operação de floats • Latência na passagem de MMX para FPU • Não permite multiplicações de unsigneds • Não permite comparações de unsigneds • Não permite divisões • Não, não, não... Luis Figueiredo - ESTG - Maio de 2003 TECNOLOGIA SSE Aspectos físicos Novos Registos XMM XMM7 XMM6 XMM5 XMM4 XMM3 XMM2 XMM1 XMM0 128 bits Luis Figueiredo - ESTG - Maio de 2003 TECNOLOGIA SSE Aspectos lógicos XMM (128 bits) DOUBLEQUADWORD FLOAT FLOAT FLOAT Luis Figueiredo - ESTG - Maio de 2003 FLOAT TECNOLOGIA SSE Principais novidades • Novos registos de 128 bits • Aritmética de floats (precisão simples) • Novas instruções (MMX e XMM) • Instruções de controlo da cache Luis Figueiredo - ESTG - Maio de 2003 TECNOLOGIA SSE Algumas instruções • PAVGB, PAVGW (MMX) • PMINUB, PMINUW (MMX) • ADDPS, SUBPS, MULPS, DIVPS (XMM) • MINPS, MAXPS (XMM) • SQRTPS (XMM) • São 70 novas instruções Luis Figueiredo - ESTG - Maio de 2003 TECNOLOGIA SSE principais limitações • Os registos XMM de 128 bits não trabalham com inteiros • Só permite a utilização de floats de precisão simples • Não permite multiplicações de inteiros de 32 bits Luis Figueiredo - ESTG - Maio de 2003 TECNOLOGIA SSE2 Aspectos físicos • Nada de novo... Luis Figueiredo - ESTG - Maio de 2003 TECNOLOGIA SSE2 Aspectos lógicos XMM (128 bits) Double float Double float float float float float doublequadword quadword doubleword word word quadword doubleword word word doubleword word word doubleword word word byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte Luis Figueiredo - ESTG - Maio de 2003 TECNOLOGIA SSE2 Principais novidades • Aritmética de floats (precisão dupla) • Aritmética de inteiros nos registos XMM • Novas instruções (MMX e XMM) • Novas instruções de controlo da cache Luis Figueiredo - ESTG - Maio de 2003 TECNOLOGIA SSE2 Algumas instruções • MOVAPD, MOVUPD • MOVLHPD, MOVHLPD • PSHUFPD • PADDQ, PSUBQ • ADDPD, SUBPD, MULPD, DIVPD • São 144 novas instruções Luis Figueiredo - ESTG - Maio de 2003 TECNOLOGIA SSE2 principais limitações • Limitações do tipo de dados em função das instruções (soma de 32 bits com saturação) • Não permite a multiplicação de palavras de 64 bits. • Os registos têm apenas 128 bits! Luis Figueiredo - ESTG - Maio de 2003 APLICAÇÕES PRÁTICAS Média de arrays em C void media( unsigned char *str1, unsigned char *str2, unsigned char *str3, int n) { int x; for(x=0;x<n;x++) str3[x]=(str1[x]+str2[x])/2; } Luis Figueiredo - ESTG - Maio de 2003 APLICAÇÕES PRÁTICAS Média de arrays com SSE2 esi ->Ponteiro para 1º array, ebp ->Ponteiro para 2º array edi ->ponteiro para destino, ecx -> número de elementos lb1: shr ecx,4 movapd XMM0,[esi] add esi,16 movapd XMM1,[ebp] add ebp,16 pavgb XMM0,XMM1 movapd [edi],XMM0 add edi,16 loop lb1 Luis Figueiredo - ESTG - Maio de 2003 APLICAÇÕES PRÁTICAS Média de arrays: resultados Nº Ciclos de Clock por elemento do Array 70 Ciclos Clock 60 50 40 C XMM 30 20 10 0 18 94 70 45 21 97 72 2 59 4 30 6 01 8 72 0 44 2 15 4 86 Luis Figueiredo - ESTG - Maio de 2003 47 41 36 31 26 20 15 6 57 88 48 42 10 52 0 Tamanho Array APLICAÇÕES PRÁTICAS Multiplicação de matrizes a1 a2 a3 a4 * Endereços crescentes b1 b2 b3 b4 = a1*b1+a2*b3 a1*b2+a2*b4 a3*b1+a4*b3 a3*b2+a4*b4 a1 b1 a2 b2 a3 b3 a4 b4 Luis Figueiredo - ESTG - Maio de 2003 APLICAÇÕES PRÁTICAS Multiplicação de matrizes a1 a2 a3 a4 * Endereços crescentes b1 b3 b2 b4 = a1*b1+a2*b3 a1*b2+a2*b4 a3*b1+a4*b3 a3*b2+a4*b4 a1 b1 a2 b3 a3 b2 a4 b4 Luis Figueiredo - ESTG - Maio de 2003 APLICAÇÕES PRÁTICAS Multiplicação de matrizes • Versão 1: Multiplicação em C – multiplicar linhas por colunas • Versão 2: Multiplicação em C com transposta – transpor 2ª matriz – multiplicar linhas por linhas • Versão 3: Multiplicação SSE2 com transposta – transpor 2ª matriz – multiplicar linhas por linhas com SSE2 Luis Figueiredo - ESTG - Maio de 2003 APLICAÇÕES PRÁTICAS Multiplicação de matrizes: Resultados Nº de ciclos de clock por cada multiplicação e adição (para matrizes de N*N temos N*N*N multiplicações e adições) 300 Ciclos Clock 250 200 C CT 150 XMM 100 50 0 24 10 0 96 6 89 Luis Figueiredo - ESTG - Maio de 2003 2 83 8 76 4 70 0 64 6 57 2 51 8 44 4 38 0 32 6 25 2 19 8 12 64 0 Tamanho da matriz APLICAÇÕES PRÁTICAS Multiplicação de matrizes: Resultados Tempo normalizado em relação à multiplicação em C 1,2 Tempo normalizado 1 0,8 C CT 0,6 XMM 0,4 0,2 0 24 10 0 96 6 89 Luis Figueiredo - ESTG - Maio de 2003 2 83 8 76 4 70 0 64 6 57 2 51 8 44 4 38 0 32 6 25 2 19 8 12 64 0 Tamanho da matriz APLICAÇÕES PRÁTICAS Algumas considerações • Efeito da cache • Alinhamento da memória (16 bytes) • Tamanho dos dados • Organização da memória Luis Figueiredo - ESTG - Maio de 2003 APLICAÇÕES PRÁTICAS Organização da memória (exemplo clássico) Typedef struct{ x y z cor x y z cor int x,y,z,cor; }ponto; ponto *lista; lista=malloc(10000*sizeof(ponto)); x y z cor Luis Figueiredo - ESTG - Maio de 2003 Elemento 0 Elemento 1 Elemento n-1 APLICAÇÕES PRÁTICAS Organização da memória (exemplo clássico) int *listax,*listay,*listaz,*listacor; listax listax=malloc(10000*sizeof(int)); listay listay=malloc(10000*sizeof(int)); listaz=malloc(10000*sizeof(int)); listacor=malloc(10000*sizeof(int)); Luis Figueiredo - ESTG - Maio de 2003 listaz listacor CONCLUSÕES • As tecnologias SIMD aumentam substancialmente a capacidade de cálculo • O programador tem que repensar alguns algoritmos • Os compiladores (actuais) não fazem todo o trabalho (não fazem quase nenhum) • O conhecimento de arquitectura de computadores dá ao programador enormes vantagens Luis Figueiredo - ESTG - Maio de 2003