在 sse 向量 m128 中找到最大浮点数
Posted
技术标签:
【中文标题】在 sse 向量 m128 中找到最大浮点数【英文标题】:finding maximum float in sse vector m128 [duplicate] 【发布时间】:2017-09-08 23:17:17 【问题描述】:我找到了 _m128i 的以下解决方案
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)
不胜感激
【问题讨论】:
【参考方案1】:使用您的算法,您可以将其转换为内部函数的单一大小的浮点版本。不是说这是最优化的解决方案,而是这样的:
float horizontal_max_Vec4(__m128 x)
__m128 max1 = _mm_shuffle_ps(x, x, _MM_SHUFFLE(0,0,3,2));
__m128 max2 = _mm_max_ps(x, max1);
__m128 max3 = _mm_shuffle_ps(max2, max2, _MM_SHUFFLE(0,0,0,1));
__m128 max4 = _mm_max_ps(max2, max3);
float result = _mm_cvtss_f32(max4);
return result;
【讨论】:
这让我看起来很愚蠢 xD 刚开始接触那些内在的东西,完全错过了 _mm_store1_ps 。谢谢:P Larsson 和@CheckersGuy:你不想存储到内存中。使用return _mm_cvtss_f32(max4)
。 (搜索Intel's intrinsics guide 的提示:float _mm
将找到返回float
的_mm*
内在函数)。如果您不走运,您的编译器会将其编译为 actual 存储/重新加载。 (如果您只使用 movss
(store1),而不是 16 字节存储,则不需要对齐 result
。)
另外,如果您没有 AVX,如果编译器没有为您优化,您可以通过仔细选择 shuffle 来保存一些 MOVAPS 指令。特别是如果你有 SSE3。水平 MAX 需要与水平 ADD 相同的随机播放,请参阅 ***.com/questions/6996764/…。
同意,_mm_cvtss_f32
可能不太可能混淆编译器。【参考方案2】:
您可以使用 DirectXMath,MS 在 _m128 上为您完成了所有工作。
【讨论】:
以上是关于在 sse 向量 m128 中找到最大浮点数的主要内容,如果未能解决你的问题,请参考以下文章