2017-01-09 19 views
3

SSE 내장 함수를 사용하여 16 개의 8 비트 정수를 4로 나눌 수 있습니까? 아니면 2를 오른쪽으로 시프트 할 수 있습니까?SSE를 사용하여 8 비트 정수를 4 (또는 시프트)로 나눕니다

+3

정확한 -march 또는 -mtune을 지정하면 자동으로 실행됩니다. https://godbolt.org/g/jxGyFd –

+1

먼저이 도구는 StackOverflow와 같은 Q & A 페이지에서 굉장합니다. 나는 그것을 즉시 북마크했다. 그리고 실제 내용의 대답을 위해, 컴파일러가 어쨌든 어셈블리에서 그것을 읽을 수 있어야하는 경우 자동으로 수행하는 경우 어셈블리를 살펴볼 것입니다. – miho

+0

@RichardHodges 코드가 실제로 실망 스럽다는 것을 알게 된 Clang은 좋은 일을합니다. – harold

답변

4

불행히도 8 비트 요소에 대한 SSE 시프트 명령어가 없습니다. 요소가 8 비트 이고 부호가없는 인 경우 16 비트 시프트를 사용하여 원치 않는 상위 비트를 마스크 아웃 할 수 있습니다 (예 : 8 비트 를 들어

v = _mm_srli_epi16(v, 2); 
v = _mm_and_si128(v, _mm_set1_epi8(0x3f)); 

은 그냥 다음 8 비트 다시 팩, 16 비트 풀고 손떨림을 할 쉬울 수도 있지만 그것은 가능한 조금 fiddlier하지만 여전히 요소를 체결했다.

+1

감사합니다. epi8 가짜 매크로를 작성해 주셔서 감사합니다.'''#define _mm_srli_epi8 (mm, Imm) _mm_and_si128 (_mm_set1_epi8 (0xFF >> Imm), _mm_srli_epi32 (mm, Imm))''' – miho

+1

@miho : 여기에 인라인 함수 대신 매크로로 쓰는 것이 실제로 이점이 없다는 것에주의하십시오. –

+1

@DietrichEpp :'_mm_srli_epi32'의'Imm'가 (특히 디버그 빌드에서) 리터럴 상수가 아니라면 인라인 함수에서 문제가 될 수있는 컴파일러가 있습니다. gcc의 현재 버전이나 최신 버전에서는 문제가 없습니다. , clang, ICC. –