Guia sobre SSE e Produto escalar usando SSE 4.1

A primeira dica é o site de guia de referência das funções intrinsecas da Intel (aqui). Interessa para quem quer saber como funciona uma função e qual versão do SSE é suportada.

A segunda dica é que o GCC, para a arquitetura x86-64, costuma usar, automaticamente, SSE em operações de ponto flutuante. Assim, escrever funções que lidam com SSE costuma gerar códigos mais eficientes… Por exemplo:

#include <x86intrin.h>

float dot_product(float v1[3], float v2[3])
{
  return (v1[0]*v2[0]) + (v1[1]*v2[1]) + (v1[2]*v2[2]);
}

float dot_product_sse(__m128 v1, __m128 v2)
{
  return _mm_cvtss_f32( _mm_dp_ps(v1, v2, 0x71 ) );
}

Em meus códigos uso os tipos __m128 para acomodar as 4 coordenadas (x, y, z, w), de tipos float, nesta ordem, onde a coordenada w é sempre zero (a não ser que eu precise usá-la com outro valor, no caso de manipulação de coordenadas homogêneas). No exemplo acima, em C, a função dot_product_sse() gera código de apenas 1 instrução (sem contar com a chamada e o retorno) – É necessário compilar com a opção -msse4.1:

dot_product:
  movss xmm0, DWORD PTR [rdi]
  movss xmm1, DWORD PTR [rdi+4]
  mulss xmm0, DWORD PTR [rsi]
  mulss xmm1, DWORD PTR [rsi+4]
  addss xmm0, xmm1
  movss xmm1, DWORD PTR [rdi+8]
  mulss xmm1, DWORD PTR [rsi+8]
  addss xmm0, xmm1
  ret

dot_product_sse:
  dpps xmm0, xmm1, 113
  ret

Interessante, né? :)

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s