Soy nuevo en las instrucciones SSE2. Encontré una instrucción _mm_add_epi8
que puede agregar dos elementos de matriz. Pero quiero una instrucción SSE que pueda agregar todos los elementos de una matriz.Instrucciones de SSE para agregar todos los elementos de una matriz
yo estaba tratando de desarrollar este concepto utilizando este código:
#include <iostream>
#include <conio.h>
#include <emmintrin.h>
void sse(unsigned char* a,unsigned char* b);
void main()
{
/*unsigned char *arr;
arr=(unsigned char *)malloc(50);*/
unsigned char arr[]={'a','b','c','d','e','f','i','j','k','l','m','n','o','p','q','r','a','b','c','d','e','f','i','j','k','l','m','n','o','p','q','r'};
unsigned char *next_arr=arr+16;
for(int i=0;i<16;i++)
printf("%d,%c ",next_arr[i],next_arr[i]);
sse(arr,next_arr);
getch();
}
void sse(unsigned char* a,unsigned char* b)
{
__m128i* l = (__m128i*)a;
__m128i* r = (__m128i*)b;
__m128i result;
result= _mm_add_epi8(*l, *r);
unsigned char *p;
p=(unsigned char *)&result;
for(int i=0;i<16;i++)
printf("%d ",p[i]);
printf("\n");
l=(__m128i*)p;
r=(__m128i*)(p+8);
result=_mm_add_epi8(*l, *r);
p=(unsigned char *)&result;
printf("%d ",p[0]);
l=(__m128i*)p;
r=(__m128i*)(p+4);
result=_mm_add_epi8(*l, *r);
p=(unsigned char *)&result;
l=(__m128i*)p;
r=(__m128i*)(p+2);
result=_mm_add_epi8(*l, *r);
p=(unsigned char *)&result;
l=(__m128i*)p;
r=(__m128i*)(p+1);
result=_mm_add_epi8(*l, *r);
p=(unsigned char *)&result;
printf("result =%d ",p[0]);
}
Así puede alguien por favor dígame cómo es posible añadir todos los elementos de una matriz mediante instrucciones SSE2?
Cualquier ayuda será apreciada.
Cerrado como duplicado porque 'psadbw' es * significativamente * más eficiente para sumar elementos de 8 bits sin desbordamiento, y la respuesta allí lo usa. Úselo con 'paddd' o' paddq' para arreglos grandes. –