如何在RVV 1.0中高效实现类AArch64 addp的向量水平成对求和?
RVV 1.0 高效实现AArch64 addp风格的水平成对求和
要实现与AArch64 addp v0.8h, v1.8h, v2.8h等价的水平成对求和操作,该指令功能为将两个输入向量的相邻元素成对求和,结果依次填充到目标向量中:
# AArch64 addp指令功能拆解 v0.h[0] = v1.h[0] + v1.h[1] v0.h[1] = v1.h[2] + v1.h[3] v0.h[2] = v1.h[4] + v1.h[5] v0.h[3] = v1.h[6] + v1.h[7] v0.h[4] = v2.h[0] + v2.h[1] v0.h[5] = v2.h[2] + v2.h[3] v0.h[6] = v2.h[4] + v2.h[5] v0.h[7] = v2.h[6] + v2.h[7]
高效实现方案(基于vredsum.vv)
RVV 1.0的vredsum.vv指令原生支持2元素分组的水平求和,完美匹配addp的逻辑,结合向量滑动指令即可快速拼接结果,仅需4条指令:
# 设置向量配置:长度8,16位半字元素,掩码格式m2,尾部/掩码行为ta, ma vsetivli x0, 8, e16, m2, ta, ma # 处理输入向量v1,生成前4个元素为成对和 vredsum.vv vtmp, v1 # 将vtmp的前4个成对和存入目标向量v0的低4位 vmv.v.v v0, vtmp # 处理输入向量v2,生成前4个元素为成对和 vredsum.vv vtmp, v2 # 将vtmp的前4个成对和滑动到v0的高4位,完成结果拼接 vslideup.vx v0, vtmp, 4
指令细节说明
vredsum.vv vtmp, vs:对输入向量vs按连续2个元素分组求和,结果存入vtmp的前vl/2个位置(此处vl=8,即前4个元素),剩余位置的原值不影响后续操作。vslideup.vx v0, vtmp, 4:将vtmp的内容向上滑动4个位置,填充到v0的高4位,低4位保留之前从v1生成的结果。
与其他思路的对比优势
- 对比
vslide+带掩码vadd+vrgather组合:无需手动构建掩码或索引向量,指令数量更少,避免了掩码操作带来的额外开销。 - 对比复杂的
vredsum.vs用法:直接使用vredsum.vv完成分组求和,逻辑更直观,无需额外的标量或辅助向量操作。
该方案可灵活适配不同长度或元素类型的向量,只需调整vsetivli的参数(例如将e16改为e32处理32位数据,修改长度值)即可。
内容的提问来源于stack exchange,提问作者Noney
相关产品推荐
相关产品推荐

