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

use*_*756 4 c sse simd

像这样的东西:

_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]));
Run Code Online (Sandbox Code Playgroud)

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

Mys*_*ial 9

没有简单的方法可以做到这一点.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);
Run Code Online (Sandbox Code Playgroud)

我注意到最后的商店并不是真的应该是商店.将值赋入float数据类型只是一个hack .

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