是否有相当于 _mm_slli_si128(__m128i a, int num) 的浮点数?
Posted
技术标签:
【中文标题】是否有相当于 _mm_slli_si128(__m128i a, int num) 的浮点数?【英文标题】:Is there an equivalent of _mm_slli_si128(__m128i a, int num) for floats? 【发布时间】:2016-11-06 00:44:19 【问题描述】:假设我有一个包含 4 个浮点数的向量:
__m128 vector = |f0|f1|f2|f3| (pseudocode)
我的意图是将这个变量转换成这个:
|0.0|f0|f1|f2|
右移似乎是最简单的选择,但我无法找到这种可用于浮点数的内在函数。
最快的方法是什么?
【问题讨论】:
_mm_shuffle_ps
+ _mm_and_ps
我已经做到了,并且原理有效。但是,我不确定应该输入哪些值作为参数以保留最后一个浮点数:vb = _mm_and_ps(vb, _mm_set_ps(?, ?, ?, 0))。
另一种方法是使用两个强制转换:_mm_castsi128_ps
和 _mm_castps_si128
,这样您仍然可以使用 '_mm_slli_si128' 。这些强制转换不会生成任何指令。唯一的惩罚是从浮点数域到整数域的延迟会略有增加,反之亦然。
【参考方案1】:
这是我的解决方案:
__m128 const mask = _mm_castsi128_ps(_mm_set_epi32(0, -1, -1, -1));
vector = _mm_shuffle_ps(vector, vector, _MM_SHUFFLE(0,3,2,1))
vector = _mm_and_ps(vector, mask);
【讨论】:
以上是关于是否有相当于 _mm_slli_si128(__m128i a, int num) 的浮点数?的主要内容,如果未能解决你的问题,请参考以下文章