terça-feira, setembro 22, 2009

Operações com vetor usando SSE Parte II

Parte I

Agora segue as quatro operações com vetores usando SSE foi usando g++ e o inline assembly, mais portar para outros compiladores é uma tarefa simples


**** vec4.hpp ****
#ifndef __vec4hpp__


typedef struct vec4f

{

float x;

float y;

float z;

float w;

}

vec4f __attribute__ ((aligned(16)));

// Soma de Vetores
inline vec4f operator+(vec4f a, vec4f b)

{

vec4f r;

asm("movaps %[ina], %%xmm0 \n\t" \

"movaps %[inb], %%xmm1 \n\t" \

"addps %%xmm0, %%xmm1 \n\r" \

"movaps %%xmm1, %[o] \n\t" \

: [o] "=m"(r)

: [ina] "m"(a), [inb] "m"(b));

return r;

}

// Subtração de Vetores
inline vec4f operator-(vec4f a,vec4f b)

{

vec4f r;

asm("movaps %[ina], %%xmm0 \n\t" \

"movaps %[inb], %%xmm1 \n\t" \

"subps %%xmm1, %%xmm0 \n\r" \

"movaps %%xmm0, %[o] \n\t" \

: [o] "=m"(r)

: [ina] "m"(a), [inb] "m"(b));

return r;

}

// Multiplicação de Vetores
inline vec4f operator*(vec4f a,vec4f b)

{

vec4f r;

asm("movaps %[ina], %%xmm0 \n\t" \

"movaps %[inb], %%xmm1 \n\t" \

"mulps %%xmm0, %%xmm1 \n\r" \

"movaps %%xmm1, %[o] \n\t" \

: [o] "=m"(r)

: [ina] "m"(a), [inb] "m"(b));

return r;

}

// Divisão de Vetores
inline vec4f operator/(vec4f a,vec4f b)
{

vec4f r;

asm("movaps %[ina], %%xmm0 \n\t" \

"movaps %[inb], %%xmm1 \n\t" \

"divps %%xmm1, %%xmm0 \n\r" \

"movaps %%xmm0, %[o] \n\t" \

: [o] "=m"(r)

: [ina] "m"(a), [inb] "m"(b));

return r;

}
#endif

*** EOF ***
 
Segue um teste básico
 
*** teste_cpp.cpp ****
 
#include "vec4.hpp"


#include

void printV(vec4f v)

{

printf("x: %f y: %f z: %f w: %f\n",v.x, v.y, v.z, v.w);

}



int main(int argc,char **argv)

{

vec4f a = {10.f,10.0f,10.0f,10.0f};

vec4f b = {2.0f,2.0f,2.0f,2.0f};

vec4f c;
printf("a ");

printV(a);

printf("b ");

printV(b);

c = a + b;

printf("a + b \n");

printV(c);

c = a - b;

printf("a - b \n");

printV(c);

c = a * b;

printf("a * b \n");

printV(c);

c = a / b;

printf("a / b \n");

printV(c);

vec4f z = a*a / b;


printf("z = a*a /b \n");

printV(z);

return 0;

}
 *** EOF ***


O Resultado:
a x: 10.000000 y: 10.000000 z: 10.000000 w: 10.000000


b x: 2.000000 y: 2.000000 z: 2.000000 w: 2.000000

a + b

x: 12.000000 y: 12.000000 z: 12.000000 w: 12.000000

a - b

x: 8.000000 y: 8.000000 z: 8.000000 w: 8.000000

a * b

x: 20.000000 y: 20.000000 z: 20.000000 w: 20.000000

a / b

x: 5.000000 y: 5.000000 z: 5.000000 w: 5.000000

z = a*a /b

x: 50.000000 y: 50.000000 z: 50.000000 w: 50.000000


por equanto tudo tranquilo, o próximo passo é fazer as multiplicação por matrizes, apesar de não ser ideal fazer por SSE mas é de maneira geral um artigo interessante, então no próximo da série trataremos de multiplicação de vetores por matrizes

Sem comentários: