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:
Enviar um comentário