_mm_mul_epu32与_mm_mul_epi32

时间:2013-10-24 20:57:56

标签: c++ sse intrinsics

要开始讨论,_mm_mul_epu32和_mm_mul_epi32之间的基本区别是:

  • _mm_mul_epu32 在SSE2中可用,并且生成无符号整数(32位 - > 64位)

  • _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 个答案:

答案 0 :(得分:1)

当操作数应被视为无符号整数时使用_mm_mul_epu32,否则使用_mm_mul_epi32

32位 - > 64位乘法,将操作数视为无符号或有符号会产生不同的结果,因此有单独的指令。 Add,sub和mov不需要单独的指令。没有单独的__m128u类型。只需使用__m128i并记住它包含无符号数字。