c - 如何找到 __m128(F32vec4) 中的最大成员

标签 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]));

如何直接使用 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);

我注意到 final 商店实际上不应该是一家商店。将值转换为 float 数据类型只是一种技巧。

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

关于c - 如何找到 __m128(F32vec4) 中的最大成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11165314/

相关文章:

c - 在 C 中将 strcpy 与字符串数组一起使用

c++ - 创建构建框架以支持编译支持多平台的代码

c - 指针默认值。?

c++ - 适用于 GNU C++ 的 SSE SSE2 和 SSE3

visual-studio - 在MSVC上从__m128逐位转换为__m128i

c - 如何在 C 语言中使用 SSE 内在函数计算单 vector 点积

c# - 使用java或其他编程语言将小图标添加到任何文件/文件夹作为Windows中的图标

c++ - 如何使用 SSE 高效地进行 int8/int64 转换?

c - 使用 SSE 从 _m128i 寄存器中提取非零值

c++ - 是否可以使用 SSE 对此嵌套进行矢量化?