Mais uma rotina otimizada com SSE

De novo vou mostrar uma rotina relacionada à Geonetria Analítica: O produto escalar. Dessa vez para mostrar que, mesmo que a rotina pareça não melhorar grandes coisas, SSE realmente o faz.

O produto escalar é simples: Multiplica-se os componentes do vetor e depois soma-se os valores encontrados. O resultado final é o tamanho da projeção de um vetor sobre o outro… As rotinas ficam assim:

#include <stdint.h> 
#include <stdio.h>
#include <xmmintrin.h>
#include "rdtsc.h"

typedef union {
  float v[4] __attribute__((aligned(16)));
  __m128 x;
} vec4;

float DotProduct(vec4 *v1, vec4 *v2)
{
  return ((v1->v[0] * v2->v[0]) + 
          (v1->v[1] * v2->v[1]) + 
          (v1->v[2] * v2->v[2]));
}

float DotProductSSE(vec4 *v1, vec4 *v2)
{
  vec4 r;

  r.x = _mm_mul_ps(v1->x, v2->x);
  return r.v[0] + r.v[1] + r.v[2];
}

int main(void)
{
  uint64_t t;
  vec4 v1 = { 3, 2, 1, 1 };
  vec4 v2 = { 6, 5, 4, 1 };
  float v;

  BEGIN_RDTSC(t);
  v = DotProduct(&v1, &v2);
  END_RDTSC(t);
  printf("dp = %f\n", v);
  printf("DotProduct() cicles: %llu\n\n", t);

  BEGIN_RDTSC(t);
  v = DotProductSSE(&v1, &v2);
  END_RDTSC(t);
  printf("dp = %f\n", v);
  printf("DotProduct() cicles: %llu\n\n", t);

  return 0;
}

De novo, para compilar o programa use:

$ gcc -O0 -mtune=native -msse \
  -mfpmath=both -fomit-frame-pointer test.c rdtsc.c -o test
$ ./test
dp = 32.000000
DotProduct() cicles: 2527

dp = 32.000000
DotProduct() cicles: 84

Como você pode ver, a rotina que usa SSE é cerca de 30 vezes mais veloz que a que não usa. A explicação para isso é que multiplicações e divisões tomam muito tempo de processamento. Ao usarmos SSE fazemos 3 multiplicações de uma só vez.

Deixem-me lembrá-los que SSE está disponível desde fevereiro de 1999 — desde o lançamento do Pentium3…

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