2010-12-05 2 views
5

SSE 내장 함수를 사용하여 코드를 최적화하려고하지만 SSE 내장 함수 작업을 수행 한 후 벡터에서 정수 값을 추출하는 좋은 방법을 모르는 곳에 문제가 있습니다. 필요.128 비트 SSE 벡터에서 32 비트 정수 값을로드하고 추출하는 가장 효율적인 방법은 무엇입니까?

누구든지이 작업을 수행하는 좋은 방법을 알고 있습니까? 나는 C로 프로그래밍하고 있으며, 컴파일러는 gcc 버전 4.3.2이다.

도움 주셔서 감사합니다.

+0

흠 ...'int * pointer = vectoraddress; * (포인터 ++) 네 번'? – khachik

+0

SSE 레지스터에서 모든 작업을 수행 할 수없는 이유가 있습니까? 작업을 마친 후 다시 SSE 레지스터를 메모리로 되돌릴 수 있습니까? –

+0

시도했지만 컴파일 오류가 계속 발생했습니다. – Kaigi

답변

7

귀하가 갖고있는 SSE 지원의 최소 수준에 관해 귀하가 가정 할 수있는 내용에 따라 다릅니다.

SSE2로 돌아가려면 128 비트 벡터에서 16 비트 요소를 추출하는 데 사용할 수있는 _mm_extract_epi16 (PEXTRW)이 있어야합니다. 32 비트 요소의 두 부분을 얻으려면이 함수를 두 번 호출해야합니다.

최신 버전의 SSE (SSE4.1 이상)에서는 _mm_extract_epi32 (PEXTRD)을 사용하여 하나의 명령어로 32 비트 요소를 추출 할 수 있습니다.

또는 성능에 민감한 루프 내부에 없으면 union을 사용할 수 있습니다 (예 : union).

typedef union 
{ 
    __m128i v; 
    int32_t a[4]; 
} U32; 
+1

안녕하세요 Paul, 답장을 보내 주셔서 감사합니다. 그 기능들을 어디에서 찾았습니까 (mm_extract_epi16/32)? 나는 gcc 문서에서 그들을 볼 수 없다. -mmmx -msse -msse2 및 -msse3을 포함시키지 않으면 컴파일러에서 암시 적 함수 선언이 있다고 말합니다. – Kaigi

+2

@Kaigi :'_mm_extract_epi16'은 emmintrin.h에 있고'_mm_extract_epi32'는 smmintrin.h에 있습니다. 후자에 대해 합리적으로 최신 버전의 gcc가 필요합니다. –

5
_mm_extract_epi32 

추출물의 내장 함수는 참으로 최선의 방법입니다하지만 당신은 SSE2를 지원해야하는 경우,이 권하고 싶습니다 :

inline int get_x(const __m128i& vec){return _mm_cvtsi128_si32 (vec);} 
inline int get_y(const __m128i& vec){return _mm_cvtsi128_si32 (_mm_shuffle_epi32(vec,0x55));} 
inline int get_z(const __m128i& vec){return _mm_cvtsi128_si32 (_mm_shuffle_epi32(vec,0xAA));} 
inline int get_w(const __m128i& vec){return _mm_cvtsi128_si32 (_mm_shuffle_epi32(vec,0xFF));} 

내가 찾은 당신은/노조를 reinterpret_cast 경우 어떤 int [4] 표현에 대한 벡터 컴파일러는 물건을 메모리로 플러시하는 경향이있다. (나쁘지 않을 수도있다.) 그리고 그것을 int로 다시 읽는다. 어셈블리의 최신 버전이 컴파일러가 더 나은 코드를 생성합니다.

관련 문제