像这样的东西:
_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 执行此操作?
最佳答案
没有简单的方法可以做到这一点。 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 个值。)关于c - 如何在 __m128(F32vec4) 中找到最大成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11165314/