0
我发现_m128i发现在上证所矢量M128最大浮动
int horizontal_max_Vec4i(__m128i x) {
__m128i max1 = _mm_shuffle_epi32(x, _MM_SHUFFLE(0,0,3,2));
__m128i max2 = _mm_max_epi32(x,max1);
__m128i max3 = _mm_shuffle_epi32(max2, _MM_SHUFFLE(0,0,0,1));
__m128i max4 = _mm_max_epi32(max2,max3);
return _mm_cvtsi128_si32(max4);
}
以下解决方案会是什么一个返回M128的最大浮动同等功能?
(我可以使用SSE和AVX的任何版本)
希望得到任何帮助
这让我看起来很蠢xD刚开始时那些内在的,完全错过了_mm_store1_ps。谢谢:P – CheckersGuy
Larsson和@CheckersGuy:你不想存储到内存中。使用'return _mm_cvtss_f32(max4)'。 (提示搜索[英特尔内部函数指南](https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=float%20_mm):'float _mm'将会找到'_mm *'返回'float'的内在函数)。如果你不走运,你的编译器会把它编译成* actual * store/reload。 (如果你只使用movss(store1)而不是16字节存储,你不需要'结果'对齐。) –
另外,如果你没有AVX,你可以保存一些MOVAPS如果编译器没有为您优化这些指令,请仔细选择shuffle。特别是如果你有SSE3。水平MAX需要与水平ADD相同的洗牌,所以请参阅https://stackoverflow.com/questions/6996764/fastest-way-to-do-horizontal-float-vector-sum-on-x86。 –