_mm_mul_epu32 与 _mm_mul_epi32
Posted
技术标签:
【中文标题】_mm_mul_epu32 与 _mm_mul_epi32【英文标题】:_mm_mul_epu32 vs. _mm_mul_epi32 【发布时间】:2013-10-24 20:57:55 【问题描述】:开始讨论,_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 的示例吗?谢谢!
【问题讨论】:
二进制补码编码使有符号数和无符号数之间的差异在加载、存储、添加和替换时消失。这就是为什么只有 _mm_set_epi32 而没有 _mm_set_epu32 的原因。但这对于 muls 和 divs 来说确实很重要。 谢谢!我想我需要在有符号整数和无符号整数之间进行转换,因为我碰巧想使用 4 路 SSE 来模拟向量寄存器中的 64 位乘法。 @chys 谢谢!不幸的是,我还没有足够的声望来投票给你的答案。 【参考方案1】:当操作数应被视为无符号整数时使用_mm_mul_epu32
,否则使用_mm_mul_epi32
。
在 32 位 -> 64 位乘法中,将操作数视为无符号或有符号会产生不同的结果,因此有单独的指令。 add、sub 和 mov 不需要单独的指令。没有单独的__m128u
类型。只需使用 __m128i
并记住它包含无符号数字。
【讨论】:
以上是关于_mm_mul_epu32 与 _mm_mul_epi32的主要内容,如果未能解决你的问题,请参考以下文章
Qt (Creator) 与 WinSocks (ws2_32)
Winsock2.h 与 winsock2.h 和 wsock32.lib 与 ws2_32.lib