如何在 __m128(F32vec4) 中找到最大成员

Posted

技术标签:

【中文标题】如何在 __m128(F32vec4) 中找到最大成员【英文标题】:How to find the max member in a __m128(F32vec4) 【发布时间】:2012-06-22 23:14:39 【问题描述】:

类似这样的:

_declspec(align(16)) float dens[4];

//Here the code comes. F32vec4 S_START, Pos, _Vector

*((__m128*)dens) = (S_START - Pos) *_Vector;

float steps = max(max(dens[3], dens[2]), max(dens[1], dens[0]));

如何直接使用 SSE 执行此操作?

【问题讨论】:

【参考方案1】:

没有简单的方法可以做到这一点。 SSE 并不特别适用于水平操作。所以你必须洗牌......

这是一种方法:

__m128 a = _mm_set_ps(10,9,7,8);

__m128 b = _mm_shuffle_ps(a,a,78);  //  a,b,c,d -> c,d,a,b
a = _mm_max_ps(a,b);

b = _mm_shuffle_ps(a,a,177);        //  a,b,c,d -> b,a,d,c
a = _mm_max_ss(a,b);

float out;
_mm_store_ss(&out,a);

我注意到,最终的商店实际上并不应该是一家商店。将值放入 float 数据类型只是一种技巧。

实际上不需要任何指令,因为float 类型将存储在相同的 SSE 寄存器中。 (只是忽略了前 3 个值。)

【讨论】:

以上是关于如何在 __m128(F32vec4) 中找到最大成员的主要内容,如果未能解决你的问题,请参考以下文章

从 __m128i 中查找最小值/最大值

__m128, SSE4 中最大绝对值的符号

使用 SSE 的任意位置 2 输入混洗

如何在 MSVC 中高效地将两个 __m128d 转换为一个 __m128i?

如何在 gcc 中静态初始化 __m128i 数组?

如何在 __m128 变量中包含一个整数?