2013-02-06 2 views
1

: _mm_srl_epi32를 잘못 사용하고 있습니까? 이 작은 코드 예제

__m128i twos = _mm_set_epi32(2,3,1,2); 
__m128i foo = _mm_set_epi32(128,128,128,128); 
__m128i shifted = _mm_srl_epi32(foo,twos); 

는 "이동"은 각각 I가 두 값 32,16,64 4 개의 32 비트 정수 가득 기대하면서, 제로 가득, 32. 내재적 인 잘못을 사용하고 있습니까?

+0

요소 별 이동을 원한다면 AMD의 XOP 또는 Intel의 AVX2 명령어가 필요합니다. – Mysticial

+0

@Mysticial 필자는 SIMD가 기대하는 어떤 것들이 초기 SSE 버전에서는 사용 가능하지 않았으므로 (지금도 일부는 사용 가능하지 않음), 간단한 것 SSE 4.1에서만 사용할 수 있었던 32 비트 요소에 대한 4 요소 승수. 나는 이것이 단순히 비용 요소 (SIMD ALU를 CPU에 통합하기에는 너무 비싸다) 일지 궁금해한다 ... 분명히 그들은 이런 종류의 것들을 가져야 만한다. – TravisG

답변

4

예, 잘못 사용하고 있습니다. _mm_srl_epi32()의 두 번째 인수는 첫 번째 인수를 이동하는 비트 수를 지정하지만 예상 한대로 벡터화 된 인수가 아니므로 각 32 비트 정수를 다른 비트 수만큼 이동시킬 수 있습니다. 대신 128 비트 인수는 64 비트로 잘리고 결과 카운트는 시프트 할 비트 수를 결정하는 데 사용됩니다. 동일한 시프트 량이 첫 번째 인수의 모든 4 개의 정수에 사용됩니다. 귀하의 경우, 하위 64 비트는 0x0000000100000010이며 매우 큰 양수로 평가됩니다. 결과적으로 모든 비트가 시프트됨에 따라 foo의 모든 요소가 0으로 플러시됩니다.

인텔의 AVX Programmer's Reference은 모든 명령어에 대한 자세한 내용을 모두 찾을 수있는 좋은 곳입니다. 제목이 약간 틀릴 수는 있지만 문서에는 인텔의 C++ 컴파일러 (일반적으로 gcc 및 기타에서 사용 가능)에서 사용할 수있는 모든 SSE/SSE2 /.../ AVX/AVX2 지침과 해당 내장 함수에 대한 설명이 포함되어 있습니다. 문서에서 _mm_srl_epi32을 검색하면 지침이하는 일에 대한 명확한 설명이 제공됩니다.