【问题标题】:Is there an equivalent of _mm_slli_si128(__m128i a, int num) for floats?是否有相当于 _mm_slli_si128(__m128i a, int num) 的浮点数?
【发布时间】: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' 。这些强制转换不会生成任何指令。唯一的惩罚是从浮点数域到整数域的延迟会略有增加,反之亦然。

标签: c++ c vectorization intel intrinsics


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多