为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUWWW 2019-06-09 16:58:44
在x86上实现水平浮点向量和的最快方法你有三个(或四个)浮动向量。最快的方法是什么?SSE(移动,洗牌,添加,移动)总是比X87快吗?SSE4.2中的水平添加说明值得吗?搬到FPU,然后是Faddp,Faddp要花多少钱?最快的指令顺序是什么?“试着把事情安排好,这样你就可以一次把四个向量和起来”将不会被接受为答案。*-)
查看完整描述

3 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

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(但我没有测量得太近)。


查看完整回答
反对 回复 2019-06-09
?
炎炎设计

TA贡献1808条经验 获得超4个赞

你可以一分为二HADDPSSSE3中的说明:

v = _mm_hadd_ps(v, v);
v = _mm_hadd_ps(v, v);

这意味着所有元素的和。


查看完整回答
反对 回复 2019-06-09
  • 3 回答
  • 0 关注
  • 656 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信