猿问

在x86上实现水平浮点向量和的最快方法

在x86上实现水平浮点向量和的最快方法

你有三个(或四个)浮动向量。最快的方法是什么?

SSE(移动,洗牌,添加,移动)总是比X87快吗?SSE4.2中的水平添加说明值得吗?搬到FPU,然后是Faddp,Faddp要花多少钱?最快的指令顺序是什么?

“试着把事情安排好,这样你就可以一次把四个向量和起来”将不会被接受为答案。*-)


HUWWW
浏览 658回答 3
3回答

缥缈止盈

SSE 2所有四项:const __m128 t = _mm_add_ps(v, _mm_movehl_ps(v, v)); const __m128 sum = _mm_add_ss(t, _mm_shuffle_ps(t, t, 1));R1+R2+R3:const __m128 t1 = _mm_movehl_ps(v, v); const __m128 t2 = _mm_add_ps(v, t1); const __m128 sum = _mm_add_ss(t1, _mm_shuffle_ps(t2, t2, 1));我发现这些和双倍的速度差不多HADDPS(但我没有测量得太近)。

炎炎设计

你可以一分为二HADDPSSSE3中的说明:v = _mm_hadd_ps(v, v); v = _mm_hadd_ps(v, v);这意味着所有元素的和。
随时随地看视频慕课网APP
我要回答