如何在 __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) 中找到最大成员的主要内容,如果未能解决你的问题,请参考以下文章