Instituto de Computação Universidade Estadual de Campinas Conjunto de Instruções Multimídia Celso Tetsuo Nagase Suzuki RA 004859 [email protected] Disciplina MO401 Arquitetura de Computadores Introdução Acelerar a execução de aplicações multimídia. Instruções SIMD. Single Instruction, Multiple Data. Novembro de 2005 Conjunto de Instruções Multimídia 2 Roteiro Histórico Instruções Multimídia comuns Extensões Multimídia x86 Exemplo Conclusão Novembro de 2005 Conjunto de Instruções Multimídia 3 Histórico MAX (Multimedia Acceleration eXtensions) PA-RISC 1.1 (HP) – Primeira arquitetura de processadores de uso geral com instruções multimídia, lançado em Janeiro de 1994. Processador de 80MHz toca vídeos MPEG-1 em tempo real (30 frames por segundo), sem hardware adicional. Novembro de 2005 Conjunto de Instruções Multimídia 4 Instruções Multimídia Dados empacotados Novembro de 2005 Conjunto de Instruções Multimídia 8 Instruções Multimídia Operações aritméticas Novembro de 2005 Conjunto de Instruções Multimídia 9 Instruções Multimídia Shift Left Shift Right Novembro de 2005 Conjunto de Instruções Multimídia 11 Instruções Multimídia Empacotamento de dados Novembro de 2005 Conjunto de Instruções Multimídia 12 Instruções Multimídia Comparação Novembro de 2005 Conjunto de Instruções Multimídia 14 Extensões multimídia x86 MMX (Intel - 1996) 57 instruções. Usa os 8 registradores de ponto flutuante já existentes. Somente operações com números inteiros. 8 Packed Bytes, 4 Packed Words, 2 Packed Doublewords e 1 Packed Quadword. Novembro de 2005 Conjunto de Instruções Multimídia 15 Extensões multimídia x86 3DNow! (AMD - 1998) 21 instruções. Complementa a extensão MMX com operações em números de ponto flutuante de 32 bits. Instrução de prefetch que carrega uma linha do cache L1 com dados do endereço. Novembro de 2005 Conjunto de Instruções Multimídia 16 Extensões multimídia x86 SSE (Streaming SIMD Extensions – Intel – 1999) Corrige algumas limitações da extensão MMX. 8 novos registradores de 128 bits para operações em números de ponto flutuante de 32 bits. Instruções de prefetch e gravação de dados não temporais. Novembro de 2005 Conjunto de Instruções Multimídia 17 Extensões multimídia x86 Enhanced 3DNow! (AMD – 1999) Complementa a extensão 3DNow! com 24 novas instruções. Instruções para gravação de dados não temporais, conversão entre dados inteiros e de ponto flutuante e operações matemáticas. Novembro de 2005 Conjunto de Instruções Multimídia 18 Extensões multimídia x86 SSE2 (Intel – 2001) 144 novas instruções. Suporte a operações com números inteiros nos registradores de 128 bits. 2 números de ponto flutuante de 64 bits empacotados, 16 Packed Bytes, 8 Packed Words, 4 Packed Doublewords, 2 Packed Quadwords. Nos processadores AMD64, o número de registradores de 128 bits foi aumentado para 16 (XMM0 a XMM15). Novembro de 2005 Conjunto de Instruções Multimídia 19 Extensões multimídia x86 3DNow! Professional (AMD) Lançada com a linha de processadores AthlonXP. Enhanced 3DNow! + SSE. Novembro de 2005 Conjunto de Instruções Multimídia 20 Extensões multimídia x86 SSE3 (Intel – 2004) 13 novas instruções. Operações horizontais. Novembro de 2005 Conjunto de Instruções Multimídia 21 Exemplo Threshold de uma imagem em níveis de cinza. void Threshold(u_int16_t imagein[], u_int16_t imageout[], int npixels, u_int16_t threshold) { int i; for (i = 0; i < npixels; i++) if (imagein[i] > threshold) imageout[i] = 255; else imageout[i] = 0; } Novembro de 2005 Conjunto de Instruções Multimídia 22 Exemplo Threshold de uma imagem em níveis de cinza. void ThresholdSSE2(u_int16_t imagein[], u_int16_t imageout[], int npixels, u_int16_t thr) { int i; max = 255; xmm0 xmm1 for (i=0; i<npixels; i+=8, imagein+=8, imageout+=8) { asm ("movdqa (%0), %%xmm2 \n" : : "r" (imagein)); asm ("pcmpgtw %xmm0, %xmm2 \n"); asm ("pand %xmm1, %xmm2 \n"); asm ("movntdq %%xmm2, (%0) \n" : : "r" (imageout)); } } xmm2 > 120 Novembro de 2005 Conjunto de Instruções Multimídia 23 Exemplo Threshold de uma imagem em níveis de cinza. Compiladores Intel ICC 9.0.021 e GCC 3.4.4. S.O. GNU/Linux CPU Pentium 4 3GHz HT Athlon 64 3200+ Athlon XP 3200+ Sempron Mobile 2800+ C - MPixels/s 464 465 470 368 SSE 1940 (4,2x) 1655 (3,6x) 1592 (3,4x) 725 (2,0x) SSE2 2069 (4,5x) 1650 (3,6x) sem suporte 723 (2,0x) C - MPixels/s 297 442 396 335 SSE 1924 (6,5x) 1654 (3,7x) 1592 (4,0x) 723 (2,2x) SSE2 2069 (7,0x) 1654 (3,7x) sem suporte 722 (2,2x) ICC GCC Novembro de 2005 Conjunto de Instruções Multimídia 24 Conclusão O uso de instruções SIMD é importante para melhorar a velocidade de aplicações multimídia. Compiladores atuais não otimizam trechos críticos com o mesmo desempenho que a codificação direta usando instruções SIMD. Novembro de 2005 Conjunto de Instruções Multimídia 25