Escolar Documentos
Profissional Documentos
Cultura Documentos
J. Miguel Leitão
J. Miguel Leitão Extensões SIMD
Índice
Introdução _________________________________________________________ 4
Pré-requisitos ............................................................................................................................. 4
Sumário ...................................................................................................................................... 4
2
J. Miguel Leitão Extensões SIMD
AVX2 _____________________________________________________________________ 37
AVX512 ___________________________________________________________________ 37
Desenvolvimento ___________________________________________________ 38
Biblioteca intrínseca ____________________________________________________ 38
Exemplo de utilização _________________________________________________________ 39
AltiVec ___________________________________________________________ 42
3DNow!_______________________________________________________________ 42
MAX - Multimedia Acceleration eXtensions ________________________________ 43
MDMX - Mips Digital Media eXtensions ___________________________________ 43
VIS - Visual Instruction Set ______________________________________________ 43
DSPs com capacidades SIMD ________________________________________ 44
Conclusões________________________________________________________ 45
Anexo 1. Tabela cronológica de microprocessadores _________________________ 46
3
J. Miguel Leitão Extensões SIMD
Introdução
Pré-requisitos
Conhecimentos básicos de arquitectura de processadores, família Intel x86 e
programação assembly.
Sumário
Introdução às extensões de microprocessadores com tecnologias Single Instruction
Multiple Data (SIMD) mais comuns, tais como o MMX, o SSE e o SSE2.
Aplicação destas extensões na implementação de algoritmos típicos de
computação 3D e de comunicação em tempo real, com demonstrações
exemplificativas das vantagens associadas.
Breves referências a outras arquitecturas de extensões SIMD como o AltiVec e o
3DNow.
4
J. Miguel Leitão Extensões SIMD
Classifica-se como SIMD (Single Instruction Multiple Data) uma máquina que opera
muitos itens de dados simultaneamente, utilizando os mesmos processos de
manipulação para cada item de dados.
ALU
5
J. Miguel Leitão Extensões SIMD
3D-Now da AMD.
6
J. Miguel Leitão Extensões SIMD
7
J. Miguel Leitão Extensões SIMD
MMX
Registos MMX
O novo conjunto de registos MMX é constituído por 8 registos de 64 bits.
Apesar destes registos MMX serem apresentados como um melhoramento
associado à tecnologia MMX, na realidade eles são apenas nomes alternativos para
designar os 64 bits menos significativos dos registos da Unidade de Vírgula
Flutuante (R0-R7), como se mostra na figura 1.
Os registos MMX podem ser acedidos nos modos de 64 bits e de 32 bits. O modo
de acesso de 64 bits é utilizado nas transferências de 64 bits de ou para memória,
nas transferências e dados entre registos MMX, por todas as instruções lógicas,
aritméticas, de empacotamento e por algumas instruções de desempacotamento. O
modo de acesso de 32 bits é utilizado nas transferências de 32 bits de ou para
memória, na transferência de dados com os registos de uso geral e em algumas
instruções de desempacotamento.
8
J. Miguel Leitão Extensões SIMD
80 bits
64 bits
mm0
mm1
mm2
mm3
mm4
mm5
mm6
mm7
Registos MMX
Registos FPU
Tipos de dados
Para permitir o processamento paralelo de diversos itens de dados em blocos de 64
bits, foram definidos 4 tipos de dados empacotados, como se apresenta na figura
seguinte.
9
J. Miguel Leitão Extensões SIMD
63 0
Saturação
Quando se realizam operações aritméticas de inteiros podem ser obtidos resultados
fora dos limites representáveis para o tipo de dados utilizado. A metodologia de
tratamento destes excessos na maioria dos processadores aritméticos, consiste em
truncar os bits mais significativos e sinalizar, através de flags, a aplicação de nível
superior que se deve encarregar de agir em conformidade.
À semelhança do que acontece na maioria dos processadores vocacionados para o
processamento digital de sinais (DSPs), a tecnologia MMX disponibiliza 3 soluções
aritméticas para tratar estes casos de resultados fora dos limites representáveis:
Wraparound.
Saturação com sinal.
Saturação sem sinal.
A aritmética wraparound corresponde ao que acontece na maioria dos
processadores de uso genérico. Com aritmética deste tipo, os bits do resultado que
não são comportáveis pelo registo de destino são eliminados. Apenas os bits
menos significativos do resultado são colocados no registo de destino. Isto significa
ignorar os bits de carry ou overflow que possam resultar da operação realizada.
10
J. Miguel Leitão Extensões SIMD
Para exemplificar o que pode acontecer numa operação aritmética podemos supor
uma simples soma de dois vectores de amostras como os apresentados na figura
seguinte.
B 0x40
A
A+B
0x7F
No entanto, alguns dos elementos deste vector soma podem atingir valores não
representáveis para o tipo de dados respectivo. Na figura 6a é possível observar o
que acontece quando se utiliza aritmética do tipo wraparound para somar estes dois
vectores, num ambiente com inteiros de 8 bits com sinal. Todas as amostras que
resultam em valores superiores a 0x7F são mal representadas, tornando-se em
valores negativos.
11
J. Miguel Leitão Extensões SIMD
a b
Figura 6. – Resultado sujeito a: (a) wraparound; (b) saturação
Utilizando aritmética com saturação, os resultados que não são comportáveis pelo
registo de destino são limitados aos limites representáveis para o tipo de dados
respectivo.
Quando numa operação ocorre um resultado com excesso, este é automaticamente
saturado para o valor máximo representável. A figura 6b apresenta o resultado da
soma dos vectores (A e B) saturada dentro limites representáveis com 8 bits com
sinal.
Instruções MMX
As 47 novas instruções MMX podem ser agrupadas nas categorias:
Instruções Aritméticas
Instruções de Comparação
Instruções de Conversão
Instruções Lógicas
Instruções de Deslocamento
Instruções de Transferência de Dados
Instrução de Inicialização (EMMS)
Todas as mnemónicas de instruções MMX (excepto a instrução EMMS) começam
pela letra P que indica processamento de dados empacotados. Seguem-se
caracteres que identificam a operação, o tipo de saturação e o tipo de dados
utilizado, como se indica na figura seguinte.
12
J. Miguel Leitão Extensões SIMD
Packed
Operação
P XXX [[U]S][tipo] Tipo de dados: “B” - Byte (8)
“W” - Word (16)
“D” - Doubleword (32)
“Q” - Quadword (64)
com Saturação
Unsigned
Figura 7. - Formato de uma instrução MMX
Operandos
Todas as instruções MMX, excepto a instrução EMMS, esperam dois operandos. O
operando da direita é o operando fonte (SRC) e o da esquerda é o destino (DEST).
Dependendo da operação, este operando de destino pode também ser utilizado
como segunda fonte.
Por exemplo, uma instrução do tipo:
O operando fonte pode residir num registo MMX ou pode ser lido directamente da
memória.
O operando de destino é normalmente um registo MMX. O conteúdo deste registo é
sobreposto com o resultado da operação.
Para as instruções de transferência de dados os operandos fonte ou destino podem
ser registos de inteiros (instrução MOVD) ou posições de memória (instruções
MOVD e MOVQ).
Instruções Aritméticas
Adição e Subtracção
13
J. Miguel Leitão Extensões SIMD
MM3 a3 a2 a1 FFFFh
+ + + +
MM4 b3 b2 b1 8000h
Como se pode constatar pela coluna da direita, esta operação utiliza aritmética
wraparound: ao resultado da soma (FFFFh+8000h=17FFFh) é truncado o bit mais
significativo de forma a poder ser representado em 16 bits.
A figura seguinte mostra um exemplo da instrução PADDUSW MM3, [myBuffer],
que soma as 4 words de 16 bits do registo MM3 com as 4 words de igual dimensão
lidas da posição myBuffer da memória. Os 4 resultados de 16 bits são colocados no
registo MM3.
MM3 a3 a2 a1 FFFFh
+ + + +
myBuffer b3 b2 b1 8000h
Como se pode constatar pela coluna da direita, esta operação utiliza aritmética com
saturação sem sinal: como o resultado da soma (FFFFh+8000h=17FFFh) é superior
ao valor máximo sem sinal representável com 16 bits (FFFFh), é utilizado este limite
para representar a soma.
14
J. Miguel Leitão Extensões SIMD
Multiplicação
* * * *
MM4 0030h 3A65h 0200h 8000h
A instrução PMULLW (Packed Multiply Low) multiplica as words com sinal dos
operandos fonte e destino e escreve os 16 bits menos significativos do resultado no
operando de destino. A figura seguinte mostra um exemplo da instrução PMULLW
MM3, MM4
* * * *
MM4 0030h 3A65h 0200h 8000h
Soma de produtos
A instrução PMADDWD (Packed Multiply and Add) calcula os produtos das words
com sinal dos operandos fonte e destino. Os quatro resultados (doublewords de 32-
bit) são somados em pares, produzindo dois resultados de 32 bit.
A figura seguinte mostra um exemplo da instrução PMADDSW MM3, MM4.
15
J. Miguel Leitão Extensões SIMD
MM3 a3 a2 a1 a0
* * * *
MM4 b3 b2 b1 b0
Instruções de Comparação
As instruções PCMPEQ (Packed Compare for Equal) e PCMPGT (Packed Compare
for Greater Than) comparam os elementos do operando fonte com os elementos
respectivos do operando de destino. Ambas geram uma máscara de zeros ou uns
que é escrita no operando de destino, correspondente ao valor Booleano da
comparação efectuada.
As operações lógicas podem depois utilizar esta máscara para seleccionar
elementos a tratar. Isto pode ser utilizado para implementar processamentos
condicionais sem necessidade de instruções de salto. Ao contrário do que acontece
vulgarmente nas instruções que tratam dados únicos, estas instruções de
comparação não afectam flags internas.
Estas instruções de comparação empacotada podem ser aplicadas a bytes, a words
e a doublewords.
A figura seguinte mostra um exemplo da instrução PCMPGTW MM3, MM4.
MM3 21 56 88 76
>? >? >? >?
MM4 34 12 92 76
16
J. Miguel Leitão Extensões SIMD
A instrução PACKSS (Pack with Signed Saturation) converte words com sinal em
bytes com sinal ou doublewords com sinal em words com sinal, utilizando o modo
de saturação com sinal.
A instrução PACKUS (Pack with Unsigned Saturation) converte words com sinal em
bytes sem sinal, utilizando o modo de saturação sem sinal.
As instruções PUNPCKH (Unpack High Packed Data) e PUNPCKL (Unpack Low
Packed Data) convertem bytes em words, words em doublewords, ou doublewords
em quadwords.
MM4 MM3
A7 A6 A5 A4 A3 A2 A1 A0 B7 B6 B5 B4 B3 B2 B1 B0
A7 B7 A6 B6 A5 B5 A4 B4 MM3
Instruções Lógicas
As instruções PAND (Packed Bitwise Logical And), PANDN (Packed Bitwise Logical
And Not), POR (Packed Bitwise Logical OR), e PXOR (Packed Bitwise Logical
Exclusive OR) realizam operações lógicas bit a bit em operandos de 64 bits.
Instruções de Deslocamento
As instruções de deslocamento permitem deslocar, individualmente, cada elemento
no sentido e número de bits especificados.
A instrução PSLL (Packed Shift Left Logical) realiza um deslocamento lógico para a
esquerda, preenchendo os bits menos significativos que surgem à direita com
zeros.
A instrução PSRL (Packed Shift Right Logical) realiza um deslocamento lógico para
a direita, preenchendo os bits mais significativos que surgem à esquerda com
zeros.
Estas instruções de deslocamento lógico podem ser aplicadas a dados
empacotados de 8, 16, 32 e 64 bits.
A instrução PSRA (Packed Shift Right Arithmetic) realiza um deslocamento
aritmético para a direita, preenchendo os bits mais significativos que surgem à
esquerda com o bit de sinal. Esta instrução de deslocamento aritmético pode ser
aplicada a dados empacotados de 8, 16 e 32 bits.
17
J. Miguel Leitão Extensões SIMD
Instrução EMMS
A instrução EMMS (Empty MMX State) limpa os registos de estado MMX. Esta
instrução deve ser utilizada para limpar as variáveis MMX no final de uma rotina
MMX antes da execução de qualquer instrução de vírgula flutuante.
FP_code:
..
.. (* deixa a stack FP limpa *)
MMX_code:
..
EMMS (* limpa a contexto MMX *)
FP_code 1:
..
.. (* deixa a stack FP limpa *)
18
J. Miguel Leitão Extensões SIMD
acesso à memória. Estes problemas são ainda mais delicados quando se passam a
utilizar dados de 64 bits.
A maioria dos compiladores permite especificar o alinhamento das variáveis através
de directivas de controlo. De uma maneira geral, isto permite resolver de forma
simples os problemas de alinhamento das variáveis declaradas. No entanto, se esta
funcionalidade não estiver disponível ou se for ineficaz, é possível impor o
alinhamento utilizando um algoritmo como o exemplificado a seguir:
Alinhamento da Stack
Normalmente, os compiladores utilizam a stack para alocar todas as variáveis que
não sejam declaradas como estáticas. Sempre que seja necessário utilizar
quantidades de 64 bits colocadas na stack torna-se importante garantir que a stack
esteja também alinhada nas fronteiras de 64 bits.
Os blocos código seguintes, colocados respectivamente no prólogo e no epílogo de
uma função permitem garantir o alinhamento da stack dentro da função.
Prologue:
push ebp ; preserva ebp
mov ebp, esp ; stack ptr
sub ebp, 4 ; aloca espaço para
; stack ptr
and ebp, 0FFFFFFFC ; alinha a 64 bits
mov [ebp], esp ; preserva stack ptr
mov esp, ebp ; alinha esp
…
epilogue:
…
mov esp, [ebp] ; recupera esp
pop ebp ; recupera ebp
ret
19
J. Miguel Leitão Extensões SIMD
Alinhamento
n
firi 1 data j 1 p * coef p
p 0
20
J. Miguel Leitão Extensões SIMD
Exemplos de Aplicação
Selecção Condicional
Neste exemplo utiliza-se uma imagem de uma borboleta sobre um fundo verde
(imagem X) para realizar uma sobreposição condicional sobre a paisagem da
imagem Y. O resultado deve ser a imagem sobreposta (S) apresentada na figura
seguinte.
+ =
X + Y = S
Figura 14. – Soma condicional de duas imagens
21
J. Miguel Leitão Extensões SIMD
X1 X2 X3 X4 Y1 Y2 Y3 Y4
pandn pandn pandn pandn pand pand pand pand
0000h FFFFh 0000h FFFFh 0000h FFFFh 0000h FFFFh
POR
X1 Y2 X3 Y4
Apenas quatro instruções MMX são suficientes para produzir quatro pixels da
imagem final, sem a inclusão de qualquer salto ou instrução condicional.
22
J. Miguel Leitão Extensões SIMD
Neste exemplo as imagens foram tratadas utilizando 16 bits para representar cada
pixel. É também possível utilizar instruções MMX para aplicar o mesmo tratamento
a imagens representadas em 8 bits por pixel, duplicando o número de pixels
processados com o mesmo número de instruções.
Soma de Produtos
As somas de produtos são operações muito frequentes no processamento de
dados multimédia digitalizados. Os filtros e as transformações geométricas, por
exemplo, são operações normalmente implementadas através de somas de
produtos.
Como se pode observar pela figura seguinte, a implementação de uma soma de
produtos de quantidades inteiras de 16 bits pode ser efectuado pela instrução
PMADDWD, seguida da soma dos resultados parciais com a instrução PADDD.
7
x a(i ) c(i )
i 0
a0 a1 a2 a3 a4 a5 a6 a7
* * * * pmaddwd * * * *
c0 c1 c2 c3 c4 c5 c6 c7
paddd
23
J. Miguel Leitão Extensões SIMD
Produto de matrizes
O produto de 2 matrizes é um caso de utilização sistemática de somas de produtos.
O exemplo ilustrado na figura seguinte corresponde à aplicação de uma
transformação geométrica a um ponto tridimensional definido em coordenadas
homogéneas.
Rotação e
escalamento Translacção
x a0 a1 a2 a3 x
y b0 b1 b2 b3 y
z c0 c1 c2 c3 z
w d0 d1 d2 d3 1
Perspectiva
Figura 18. - Transformação geométrica de um ponto 3D
24
J. Miguel Leitão Extensões SIMD
Junção de Imagens
Neste exemplo pretende-se combinar duas imagens em função de parâmetro de
transparência (alfa), como se representa na figura seguinte.
70% + 30% =
; mm0 contém 0
; mm7 contem 4CCC 4CCC 4CCC 4CCC h (30% 30% 30% 30%)
; mm6 contém B333 B333 B333 B333 h (70% 70% 70% 70%)
; mm1 contém 8 pixels da imagem X
; mm2 contém 8 pixels da imagem Y
; preserva pixels
movq mm3, mm1
movq mm4, mm2
25
J. Miguel Leitão Extensões SIMD
26
J. Miguel Leitão Extensões SIMD
- - - - X3 X2 X1 X0 - - - - Y3 Y2 Y1 Y0
UNPACK
X3 X2 X1 X0 Y3 Y2 Y1 Y0
* * * * PMULH * * * *
70% 70% 70% 70% 30% 30% 30% 30%
R3 R2 R1 R0
PACK
- - - - R3 R2 R1 R0
27
J. Miguel Leitão Extensões SIMD
28
J. Miguel Leitão Extensões SIMD
128 bits
xmm0
xmm1
xmm2
xmm3
xmm4
xmm5
xmm6
xmm7
Figura 22. – Registos SSE (xmm0-xmm7)
a3 a2 a1 a0
op op op op op
b3 b2 b1 b0
a3 op b3 a2 op b2 a1 op b1 a0 op b0
Figura 23. – Execução em modo empacotado (packed)
29
J. Miguel Leitão Extensões SIMD
a3 a2 a1 a0
op op
b3 b2 b1 b0
a3 a2 a1 a0 op b0
Figura 24. – Execução em modo escalar (scaled)
Instrução Shuffle
A instrução SHUFPS permite copiar para os dois campos mais significativos do
registo de destino, dois dos quatro valores de vírgula flutuante colocados no registo
fonte. Os dois campos menos significativos do registo de destino podem ser
seleccionados de entre os quatro valores de vírgula flutuante inicialmente existentes
no registo de destino.
mask
MM4 MM3
A3 A2 A1 A0 B3 B2 B1 B0
Mux Mux
MM3 C3 C2 C1 C0
C0 = B[mask(1-0)]
C1 = B[mask(3-2)]
C2 = A[mask(5-4)]
C3 = A[mask(7-6)]
30
J. Miguel Leitão Extensões SIMD
31
J. Miguel Leitão Extensões SIMD
cmpps
movmksps
EAX 0 … 0 0 0 0 0 0 1 0 1 0
Figura 25. – Instruções CMPPS e MOVMSKPS
0 v0 1 2 3 4
0 d0
d1
d2
d3
d4
d_vec
d0 d1 d2 d3 d4 d5 d6 d7
v_vec
v0 v1 v2 v3 v4 v5 v6 v7
...
32
J. Miguel Leitão Extensões SIMD
a = ... // aceleração
v = _mm_load_ps(v_vec+i);
v = _mm_add_ps(v, _mm_mul_ps(a, dt)); // v = v + a.dt
_mm_store_ps(v_vec+i, v); // guarda velocidade
z0 z1 a2
d2 1
2
x1 z2
y0
x0
y1 x2
y2
h
33
J. Miguel Leitão Extensões SIMD
C1 0 S1 0 C2 S2 0 a2 C 2
S1 0 C1 0 S2 C2 0 a2 S 2
0
A1 1
A2
0 1 0 0 0 0 1 d2
0 0 0 1 0 0 0 1
Ci cos i Si sen i
C1 C2 C1 S 2 S1 a2 C1 C2 d 2 S1
S1 C2 S1 S 2 C1 a2 S1 C2 d 2 C1
0
T2 0A1 1A2
S2 C2 0 a2 S 2
0 0 0 1
SSE2
As extensões SSE2 foram introduzidas no processador Intel Pentium 4, lançado em
Novembro de 2000. Apresentam 144 novas instruções destinadas ao
processamento de dados empacotados nos registos XMM. As novas instruções
incluem funcionalidades para tratamento de novos tipos de dados como os números
de vírgula flutuante de dupla precisão e os inteiros (doubleword ou quadword). As
funcionalidades de tratamento de inteiros introduzidas na tecnologia MMX foram
agora estendidas a dados empacotados de 128 bits, duplicando portanto a
capacidade de processamento de dados deste tipo.
SSE3
As extensões SSE3 (Streaming SIMD Extensions 3) permitem um alargamento das
capacidades SIMD disponibilizadas pelas extensões SSE e SSE2. Oferecem um
aumento do desempenho no processamento de dados em diversas áreas como por
exemplo a aritmética de números complexos e na descodificação de video.
A maioria das instruções SSE e SSE2 que implementam operações aritméticas são
vocacionadas para o processamento paralelo de dados num modelo vertical. Neste
modelo, todos os elementos dos operandos de entrada são tratados uniformemente
pela mesma operação. A utilização eficiente destas instruções vocacionadas para o
processamento vertical obriga à organização dos dados em conjuntos
perfeitamente homogéneos o que por vezes implica um esforço adicional de
organização.
34
J. Miguel Leitão Extensões SIMD
35
J. Miguel Leitão Extensões SIMD
SSSE3
As extensões SSSE3 (Supplemental Streaming SIMD Extensions 3) correspondem
a uma actualização das extensões SSE3 que permite alargar as possibilidades de
processamento horizontal de dados empacotados nos registos XMM. Esta
tecnologia está disponível nos processadores Intel CORE e Intel CORE Duo.
SSE4
A versão 4 das extensões SSE disponibiliza 54 novas instruções e começou a ser
incorporada nos processadores da Intel em 2008. Um subconjunto de 47 destas
instruções foi disponibilizado nos processadores da micro-arquitectura Penryn,
sendo normalmente referido como SSE4.1. O conjunto completo das instruções
SSE4.1 com as sete instruções adicionais é por vezes referido como SSE4.2 e está
disponível em todos os processadores com a micro-arquitectura Nehalem (Core I3,
I5 e I7).
As extensões SSE4.1 são vocacionadas para o desempenho de tarefas envolvendo
dados multimédia, 3D e imagens. As suas 47 novas instruções incluem:
• Duas instruções para multiplicação de DoubleWords empacotadas.
• Duas instruções para produto escalar de vectores
• Uma instrução para leitura de dados em fluxo (streaming).
• Seis instruções para cópia e junção condicional de dados empacotados.
• Oito instruções para determinação de máximo e mínimo.
• Quatro instruções para arredondamento de valores de vírgula flutuante
• Sete instruções de transferência de dados de e para os registos XMM.
• Doze instruções para conversões de formatos de inteiros empacotados.
• Uma instrução para cálculo da soma de diferenças absolutas (SAD).
• Uma instrução de pesquisa horizontal.
• Uma instrução para implementação de comparações com máscara.
As sete instruções disponibilizadas adicionalmente nas unidades SSE4.2 incluem
instruções vocacionadas para o processamento texto e de cadeias de caracteres e
instruções que facilitam o processamento SIMD de dados localizados nos registos
de uso geral.
Mais informação: http://software.intel.com/file/18187
36
J. Miguel Leitão Extensões SIMD
AVX
As extensões AVX (Advanced Vector Extensions) são implementadas por novas
unidades computacionais SIMD apresentadas em 2008 e incorporadas nos
processadores Intel e AMD desde 2011. Apresentam um conjunto de 16 novos
registos de 256 bits designados YMM0-YMM15.
Disponibilizam novas operações com 3 operandos que evitam a sobreposição dos
operandos de entrada pelos resultados das operações. As novas instruções são
identificáveis pelo prefixo VEX e vocacionadas para o tratamento de dados de
vírgula flutuante empacotados nos novos registos.
AVX2
As extensões AVX2 encontram-se integradas em alguns processadores desde
2013 e alargam também as capacidades de processamento SIMD a dados do tipo
inteiro empacotados nos registos YMM de 256 bits.
Uma nova instrução FMA (Fused Multiply and Add) foi introduzida com o objectivo
de agilizar o cálculo de somas de produtos.
AVX512
As extensões de AVX de 512 bits foram apresentadas pela Intel em 2013.
Disponibilizam um conjunto de 32 registos de 512 bits designados ZMM0-ZMM31,
sobre o qual são mapeados os registos das unidades SIMD anteriores (YMM e
XMM).
As novas instruções são organizadas num conjunto base (AVX512 Foundation) que
será comum ao todos os processadores com esta tecnologia e conjuntos adicionais
que serão incorporados pontualmente apenas em algumas versões.
37
J. Miguel Leitão Extensões SIMD
Desenvolvimento
Biblioteca intrínseca
A biblioteca intrínseca de extensões SIMD da Intel é uma ferramenta adicional de
desenvolvimento que oferece um acesso directo às funcionalidades MMX ou SSE a
partir de programação em linguagem C. Todas as instruções MMX ou SSE
possuem uma função C correspondente na biblioteca intrínseca.
A mnemónica de linguagem assembly para somar os valores de vírgula flutuante
empacotados em dois registos XMM é addps. A biblioteca intrínseca define uma
função correspondente com o nome _mm_add_ps.
Para além de definir funções para todas as instruções, a biblioteca intrínseca define
também um tipo de dados (__m128) de 128 bits. Numa variável deste tipo é possível
armazenar 4 quantidades do tipo float. Estas variáveis podem ser inicializadas
através das funções:
__m128 _mm_load_ps(float*)
ou
__m128 _mm_set_ps(float,float,float,float);
Exemplo:
__m128 t = _mm_load_ps(a);
Ou seja,
t = [ 4.0, 3.0, 2.0, 1.0 ]
38
J. Miguel Leitão Extensões SIMD
Exemplo de utilização
Neste exemplo vai ser utilizada a funcionalidade SSE de multiplicação de números
de vírgula flutuante empacotados, acessível através da mnemónica assembly
mulps ou da função C _mm_mul_ps().
#include <xmmintrin.h>
...
__m128 a, b, c;
a = _mm_set_ps(4.0, 5.0, 1.0, 2.0);
b = _mm_set_ps(3.0, 2.0, 6.0, 8.0);
c = _mm_set_ps(0., 0., 0., 0.);
c = _mm_mul_ps(a, b);
...
v = _mm_load_ps(v_vec+i);
v = _mm_add_ps(v, _mm_mul_ps(a, dt)); // v = v + a.dt
_mm_store_ps(v_vec+i, v); // guarda velocidade
Classes C++
Outra ferramenta adicional disponível para o desenvolvimento de aplicações com
acesso às funcionalidades MMX ou SSE, são as classes C++ das famílias Ivec,
39
J. Miguel Leitão Extensões SIMD
Tipo de dados:
“I” - Inteiros
“F” - Vírgula flutuante
Sinalidade:
“” - indefinido
“s” - com sinal
“u” - sem sinal
Data size: ( 8, 16, 32, 64 )
T [sig] ds vec nd Número de dados: ( 1, 2, 4, 8, 16 )
40
J. Miguel Leitão Extensões SIMD
Iu16vec8 unsigned
I8vec16 unspecified
Is8vec16 signed char 8 16
Iu8vec16 unsigned
Exemplo de utilização
Again, assume a and b are two 128-bit numbers. The result of the computation will
be stored in another 128-bit number, c.
Neste caso utilizam-se objectos da classe F32vec4. A ordem dos parâmetros do
construtor F32vec4 é a mesma utilizada pela função _mm_set_ps.
#include <dvec.h>
...
F32vec4 a(6.0, 4.4, 37.8, 1.0);
F32vec4 b(3.0, 2.0, 1.0, 53.2);
F32vec4 c;
...
c = a * b;
...
41
J. Miguel Leitão Extensões SIMD
AltiVec
3DNow!
O 3DNow! é um conjunto de instruções SIMD desenvolvido pela Advanced Micro
Devices (AMD) para o seu processador K6-2. Constitui uma extensão à tecnologia
MMX, já disponível nos processadores desta família, para permitir o tratamento de
dados de vírgula flutuante de precisão simples (32 bits). As instruções 3DNow!
utilizam os registos MMX e permitem efectuar operações, simultaneamente, sobre
dois itens de dados.
63 32 31 0
42
J. Miguel Leitão Extensões SIMD
43
J. Miguel Leitão Extensões SIMD
a7 a6 a5 a4 a3 a2 a1 a0
44
J. Miguel Leitão Extensões SIMD
Conclusões
45
Intel Zilog Motorola IBM MIPS INMOS DEC HP AMD NS/Cyrix Outros
PDP-11
8080
1975 801
J. Miguel Leitão
AltiVec R10000 K6
MMX 3D-Now Sparc64
Pentium II R12000
Power 3
R14000 K7
PowerPC A35 Apache Alpha 21264
Pentium III
46
Extensões SIMD
2000 Itanium
Pentium 4 Alpha 21364