2013-10-24 11 views
1

논의를 시작하기 위해, 기본 _mm_mul_epu32 차이와 _mm_mul_epi32 같습니다_mm_mul_epu32 대 _mm_mul_epi32

  • _mm_mul_epu32는 부호없는 정수 (32 비트 -> 64 비트) SSE2 제공되며 취하여 생성

  • _mm_mul_epi32

  • 는 SSE4.1 제공되며, 소요 (32 비트 -> 64 비트) 정수를 체결 낸다

어떤 상황에서 사용해야하는지 이해할 수 없습니까? _mm_mul_epu32? _mm_set [1] _epi32와 같은 설정 명령어가없는 것 같습니다. 이 예에서와 같이 : SSE multiplication of 4 32-bit integers, 최선의 답 글 :

static inline __m128i muly(const __m128i &a, const __m128i &b) 
{ 
    __m128i tmp1 = _mm_mul_epu32(a,b); /* mul 2,0*/ 
    __m128i tmp2 = _mm_mul_epu32(_mm_srli_si128(a,4), _mm_srli_si128(b,4)); /* mul 3,1 */ 
    return _mm_unpacklo_epi32(_mm_shuffle_epi32(tmp1, _MM_SHUFFLE (0,0,2,0)), _mm_shuffle_epi32(tmp2, _MM_SHUFFLE (0,0,2,0))); /* shuffle results to [63..0] and pack */ 
} 

_mm_mul_epu32는 _epi32 명령과 함께 사용됩니다. 이 위험한 서명 된 및 서명되지 않은 정수의 차이를 무시할 수 있습니까?

_mm_mul_epu32를 안전하게 사용할 수있는 사례를 제공해 줄 수 있습니까? 감사!

+1

2의 보수 인코딩은로드 된, 서명 된, 서명되지 않은 숫자 사이의 차이가로드, 저장, 추가 및 하위에 대해 사라지게합니다. 그래서 _mm_set_epi32 및 _mm_set_epu32 만있는 이유입니다. 그러나 그것은 muls와 div에 중요합니다. –

+0

고마워요! 저는 4-way SSE를 사용하여 벡터 레지스터에서 64 비트 곱셈을 시뮬레이트하고 싶기 때문에 signed int와 unsigned int 사이에 캐스팅이 필요하다고 생각합니다. @chys 고마워요! 불행히도, 나는 아직 귀하의 답변을 투표에 대한 충분한 명성이 없습니다. –

답변

0

피연산자가 부호없는 정수로 간주되어야하는 경우 _mm_mul_epu32을 사용하고 그렇지 않은 경우 _mm_mul_epi32을 사용하십시오.

32 비트 -> 64 비트 곱셈에서 피연산자를 부호없는 또는 부호로 처리하면 다른 결과가 나오므로 별도의 지침이 있습니다. 추가, 하위 및 이동은 별도의 지침이 필요하지 않습니다. 별도의 __m128u 유형은 없습니다. __m128i을 사용하고 서명되지 않은 숫자가 있다는 것을 기억하십시오.