SSE2 지침을 처음 사용합니다. 두 개의 배열 요소를 추가 할 수있는 지침 _mm_add_epi8
을 발견했습니다. 하지만 배열의 모든 요소를 추가 할 수있는 SSE 명령이 필요합니다.배열의 모든 요소를 추가하는 SSE 명령어
#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]);
}
그래서 누구는 SSE2 명령어를 사용하여 배열의 모든 요소를 추가 할 수 있습니다 방법을 말씀 해주십시오 수 있습니다
은이 코드를 사용하여이 개념을 개발하기 위해 노력했다?
도움이 될 것입니다.
psadbw가 오버플로가없는 8 비트 요소를 합산하는 데 훨씬 더 효율적이므로 거기에서 대답하는 것이 유효합니다. 큰 배열의 경우'paddd' 또는'paddq '와 함께 사용하십시오. –