SSE

Origem: Wikipédia, a enciclopédia livre.
Ir para: navegação, pesquisa


Merge-arrows 2.svg
Foi proposta a fusão deste artigo ou se(c)ção com Streaming SIMD Extensions. Por favor crie o espaço de discussão sobre essa fusão e justifique o motivo aqui; não é necessário criar o espaço em ambas as páginas, crie-o somente uma vez. Perceba que para casos antigos é provável que já haja uma discussão acontecendo na página de discussão de um dos artigos. Verifique ambas (1, 2) e não se esqueça de levar toda a discussão quando levar o caso para a central.
Editor, considere adicionar mês e ano na marcação. Isso pode ser feito automaticamente, com {{Fusão|1=Streaming SIMD Extensions|{{subst:DATA}}}}.

SSE (Streaming SIMD Extensions, originalmente chamada ISSE, Internet Streaming SIMD Extensions) é uma Unidade computacional SIMD (Single Instruction, Multiple Data) ou (Única Instrução, Multiplos Dados) projetada pela Intel e introduzida em 1999 na sua série de processadores Pentium III como uma resposta ao 3DNow! da AMD's (que foi lançado um ano antes).

Ele foi conhecido originalmente como KNI para Katmai New Instructions (Katmai foi o apelido para o Pentium III). Durante o projeto Katmai a Intel estava procurando distinguí-lo de sua linha de produtos anterior, particularmente seu carro-chefe Pentium II.

O primeiro processador a suportar o SSE, foi o Pentium III. Mais tarde, a AMD adicionou suporte para instruções SSE aos seus processadores, começando com seu processador Athlon XP.

A Intel estava decepcionada com seu primeiro IA-32 esforço do SIMD, MMX. A MMX possuia dois problemas principais:

  • as capacidades SIMD oferecidas pela unidade MMX estavam disponíveis apenas para dados do tipo inteiro;
  • o remapeamento dos registos MMX sobre os registos da Unidade de Ponto Flutante impossibilitava a utilização das operações SIMD de inteiros em conjunto com operações de dados de ponto flutuante na FPU.

Registradores[editar | editar código-fonte]

O SSE adicionava 8 novos registradores de 128-bit, chamados registos XMM e numerados de 0 a 7. Cada um destes registos permite armazenar 4 dados númericos de Ponto flutuante de 32-bit.

XMM registers.png

Como o SSE adiciona suporte ao ponto flutuante, ele é muito mais útil que o MMX. O SSE se tornou ainda mais flexível com a adição de suporte a números inteiros ao SSE2. Mesmo o MMX sendo redundante, é possível fazer operações MMX em parelelo com operações SSE, o que pode aumentar ainda mais a performance. As funcionalidades SIMD para dados do tipo inteiro mantêm-se disponíveis para dados empacotados nos registos MMX de 64 bits.

Como esses novos registradores de 128 bits são estados de programa adicionais que o sistema operacional (SO) deve preservar entre mudanças de contexto de tarefas, eles devem permanecer desabilitados até que o sistema operacional os habilite explicitamente. Isto significa que o SO deve saber como usar as instruções FXSAVE e FXRSTR, que são o par de instruções estendidas que podem, respectivamente, salvar e restaurar todos os estados dos registradores x87 e SSE, de uma única vez. Este suporte foi rapidamente estendido para todos os principais sistemas operacionais para IA-32.

Como o SSE inclui suporte a ponto flutuante, ele tem mais usos do que o MMX, pois atualmemente as placas de vídeo podem tratar internamente todos os cálculos com inteiros. As operações SIMD inteiras ainda podem ser realizadas com 8 registradores de 64 bits do MMX. Como se sabe, os registradores MMX são obtidos renomeando-se (ou aliasing) os 8 registradores da FPU. Posteriormente, no SSE2, a Intel complementou o SSE com suporte a cálculos inteiros. Apesar de redundantes, as operações MMX podem ser executadas com as operações SSE, o que oferece maior desempenho em situações limitadas.

SSE usava apenas um único tipo de dado para registradores XMM:

  • Quatro números em ponto flutuante de 32-bit de precisão simples.

O SSE2 seria expandido mais tarde com o uso de registradores XMM para incluir:

  • Dois números em ponto flutuante de 64-bit de precisão dupla.
  • Dois inteiros de 64-bit ou
  • Quanto inteiros de 32-bit ou
  • Oito inteiros curtos de 16-bit ou
  • Dezesseis de 8-bit ou caracteres.

Com o lançamento do Pentium 4, a Intel introduziu a unidade SSE2 que alargou as capacidades SIMD também a dados de Ponto flutuante de precisão dupla (64-bit) e dados do tipo inteiro de 8, 16 e 32 bits, empacotados nos registos XMM. O SSE2 habilitava que o programador fizesse instruções SIMD virtualmente de qualquer tipo. Muitos programadores consideram o SSE2 como "tudo que o SSE deveria ser". Com o SSE2, era possível oferecer instruções ortogonais para vários tipos de dados.

O primeiro CPU a ter suporte ao SSE foi o Pentium III, que compartilhava recursos entre o SSE e o FPU. As aplicações eram compiladas de forma a utilizar instruções FPU e SSE em paralelo, mas os processadores Pentium III não eram capazes de operar estes dois tipos de instruções simultaneamente (num mesmo ciclo). Estas limitações reduziram a eficiência do chamado pipelining, embora os registros isolados XMM permitiam instruções SIMD e operações escalares de ponto flutuante serem misturadas mas não tão eficientes quanto o modo MMX/floating point.

Já o SSE3 foi um incremento do SSE2, adicionando novas intruções matemáticas orientadas ao processamento de sinais digitalizados e tratamento de modelos 3D.

A nova tecnologia SSE (Streaming SIMD Extensions) consiste de 70 novas instruções do tipo SIMD-FP (Single Instruction Multiple Data for Floating Point) e ainda SIMD-integer (Single Instruction Multiple Data For Integer).Algumas aplicações que são favorecidas diretamente por essa tecnologia são processamento avançado de imagens, 3D, áudio, vídeo e reconhecimento de voz. Mais especificamente:

  • Imagens de alta resolução e alta qualidade podem ser vistas e manipuladas com grandes vantagens sobre as versões anteriores dos PCs.
  • Áudio de alta qualidade, MPEG2 vídeo (DVD) e codificação e decodificação MPEG2 simultânea.
  • Menos tempo de CPU para reconhecimento de voz, assim como melhores resultados e respostas mais rápidas.

Opcodes[editar | editar código-fonte]

Instruções de movimento de Dados:

  • MOVUPS - Move 128bits de dados para um registrador SIMD da memória ou registrador SIMD. Desalinhados.
  • MOVAPS - Move 128bits de dados para um registrador SIMD da memória ou registrador SIMD. Alinhados.
  • MOVHPS - Move 64bits para bits superiores de um registrador SIMD. (Alto).
  • MOVLPS - Move 64bits para bits inferiores de um registrador SIMD. (Baixo).
  • MOVHLPS - Move 64bits superiores do registrador fonte para 64bits inferiores do registrador destino.
  • MOVLHPS - Move 64 bits inferiores do registrador fonte para 64bits superiores do registrador destino.
  • MOVMSKPS - Move bits sinais de cada um dos 4 escalares para um registrador inteiro x86.
  • MOVSS - MOva 32bits para um registrador SIMD da memória ou registrador SIMD.

Instruções Aritméticas: Um escalar irá execuar a operação no primeiro elemento somente. A versão paralela irá executar as operações em todos os elementos do registrador.

  • Paralelo | Escalar
  • ADDPS | ADDSS - Soma 4 valores de precisão simples com outros 4 valores de precisão simples.
  • SUBPS | SUBSS - Subtrai 4 valores de precisão simples com outros 4 valores de precisão simples.
  • MULPS | MULSS - Multiplica 4 valores de precisão simples com outros 4 valores de precisão simples.
  • DIVPS | DIVSS - Divide 4 valores de precisão simples com outros 4 valores de precisão simples.
  • SQRTPS | SQRTSS - Raíz quadrada de 4 valores de precisão simples.
  • MAXPS | MAXSS - Máximo do operando.
  • MINPS | MINSS - Mínimo do operando.
  • RCPPS | RCPSS - Reciprocal dos operandos.
  • RSQRTPS | RSQRTSS - Reciproca da raiz quadrada dos operandos.

Instruções de Comparação:

  • Paralela | Escalar
  • CMPPS | CMPSS - Compara os operandos e retorna todos 1s ou 0s.

Instruções Lógicas:

  • ANDPS - E bit a bit dos operandos.
  • ANDNPS - NÃO E bit a bit dos operandos.
  • ORPS - OU bit a bit dos operandos.
  • XORPS - OU EXCLUSIVO bit a bit dos operandos.

Instruções de Mistura:

  • SHUFPS - Mistura números de um operando para outro em si.
  • UNPCKHPS - Descompacta números de alta ordem para um registrador SIMD.
  • UNPCKLPS - Descompacta números de baixa ordem para um registrador SIMD.

Versões posteriores[editar | editar código-fonte]

  • SSE2, introduzidas com o Pentium 4, é um importante aprimoramento para SSE. SSE2 adiciona novas instruções matemáticas de precisão dupla (64 bits) de ponto flutuante e também se estende instruções MMX inteiro para operar sobre os registos de 128 bits XMM. Até a SSE2, instruções de inteiros introduzidas com a última extensão SSE pode ainda operar num registrador XMM de 64-bit porque o novo registrador XMM requereu suporte do sistema operacional. SSE2 permite ao programador realizar operações matemáticas SIMD em qualquer tipo de dados (de 8-bit inteiro para 64-bit float) inteiramente com o arquivo vetorial XMM-registro, sem a necessidade de usar a MMX legado ou registos FPU. Muitos programadores consideram SSE2 como "tudo o SSE deveria ter sido", como SSE2 oferece um conjunto ortogonal de instruções para lidar com tipos de dados comuns.
  • SSE3, também chamado de Novas Instruções Prescott (PNI), é uma atualização incremental para SSE2, adicionando um punhado de instruções matemáticas DSP-orientadas e algum processo (thread) instruções de gerenciamento.also called Prescott New Instructions (PNI), is an incremental upgrade to SSE2, adding a handful of DSP-oriented mathematics instructions and some process (thread) management instructions.
  • SSSE3 é uma atualização incremental para SSE3, acrescentando 16 novas instruções que incluem permutar os bytes em uma palavra, multiplicando 16-bit de ponto fixo números com arredondamento correto, e dentro de palavra-acumulação instruções. SSSE3 é muitas vezes confundido com SSE4 como este termo foi usado durante o desenvolvimento do Núcleo microarquitetura .
  • SSE4 é outro importante reforço, adicionando uma instrução de produto escalar, instruções complementares de inteiro, uma instrução POPCNT (Population Cont, ou Contador de População conta o número de bits definidos como 1), e muito mais..
  • XOP, FMA4 e CVT16 são novas iterações anunciadas pela AMD em Agosto de 2007 e revisadas em Maio de 2009.
  • AVX (Advanced Vector Extensions ou Extensão Avançada de Vetores) é uma versão avançada do SSE anunciado pela Intel com um caminho de dados aumentado de 128 bits para 256 bits e 3 instruções de operando (de 2 anteriores). Microprocessadores Intel suportando AVX são esperados em 2010. Microprocessadores AMD suportando AVX são esperados em 2011.

Exemplos[editar | editar código-fonte]

Example

O seguinte simples exemplo demonstrar as vantagens do uso do SSE. Considerando uma operação como adição em vetor, a qual é usada muito frequentemente em aplicações gráficas de computador. Para ter um resultado preciso, usa-se quatro vetores componentes junto em x86, requerendo adição de instruções para pontos flutuantes.

vec_res.x = v1.x + v2.x;
vec_res.y = v1.y + v2.y;
vec_res.z = v1.z + v2.z;
vec_res.w = v1.w + v2.w;

Isso corresponderia a quatro instruções FADD em x86 no código fonte. Por outro lado, como o seguinte pseudo código mostra, uma instrução simples 128-bits de adição de pacotes pode substituir a quarta instrução adicional escalar.

movaps xmm0, [v1]          ;xmm0 = v1.w | v1.z | v1.y | v1.x 
addps xmm0, [v2] ;xmm0 = v1.w+v2.w | v1.z+v2.z | v1.y+v2.y | v1.x+v2.x movaps [vec_res], xmm0

Problemas de Software e Hardware[editar | editar código-fonte]

Software and hardware issues

Com todos as extensões de conjuntos de instruções x86, cabe à BIOS, ao sistema operacional e ao programador da aplicação, testar e detectar sua existência e bom funcionamento.

  • Intel e AMD oferecem aplicações para detectar quais extensões seu CPU suporta.
  • O código de operação CPUID é uma instrução complementar ao processador (seu nome é derivado de CPU Identification) para a arquitetura x86. Ele foi introduzida pela Intel em 1993 quando introduziu os processadores Pentium e SL-Enhanced 486.

A captação dos usuários às extensões das aplicações x86 tem sido lenta, mesmo com o mínimo de base e suporte MMX SSE (em alguns casos), não sendo suportado por aplicações de 10 anos após essas extensões, tornando-se comumente disponíveis. A computação distribuída tem acelerado o uso destas extensões na comunidade científica - e muitas aplicações científicas recusam-se a executá-las a menos que o processador suporte SSE2 ou SSE3.

O uso de múltiplas revisões de um aplicativo para trabalhar com os muitos conjuntos diferentes de extensões disponíveis é a maneira mais simples de contornar o problema de otimização de extensões x86. Bibliotecas de software e algumas aplicações começaram a suportar vários tipos de extensões insinuando que o uso completo de instruções x86 disponíveis pode finalmente tornar-se comum a cerca de 5 a 15 anos após as instruções serem apresentadas inicialmente.

Ver também[editar | editar código-fonte]

Instruções x86
FPU: FDIV
SIMD: MMXEMMX3DNow!3DNow!+SSE (MMX+) – SSE2SSE3SSSE3SSE4