You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用AVX2 intrinsics高效实现单精度打包向量右移?

使用AVX2实现单精度向量的右移操作

要实现你需要的右移效果(将向量元素整体右移一位,第一个元素可任意),可以利用AVX2的跨lane指令,以下是两种高效的实现方式:

方法一:使用_mm256_permutevar8x32_ps(元素级置换)

这个指令允许通过32位索引掩码任意重排256位单精度向量的元素。我们构造掩码让目标向量的第1-7位对应原向量的第0-6位,第0位取原向量最后一个元素(符合你对X的任意值要求):

#include <immintrin.h>

__m256 foo(__m256 vec) {
    // 掩码:目标索引0取原索引7,1取0,2取1...7取6
    const __m256i perm_mask = _mm256_setr_epi32(7, 0, 1, 2, 3, 4, 5, 6);
    return _mm256_permutevar8x32_ps(vec, perm_mask);
}

方法二:使用_mm256_alignr_epi8(字节级对齐移位)

将向量转换为整数类型后,利用字节级对齐移位指令实现整体右移。本质是把原向量与自身拼接成512位数据,截取偏移28字节的256位(对应右移一个4字节的float元素):

#include <immintrin.h>

__m256 foo(__m256 vec) {
    __m256i vec_int = _mm256_castps_si256(vec);
    // 偏移28字节截取,得到 [原第7个元素, 原第0个元素, ..., 原第6个元素]
    __m256i shifted_int = _mm256_alignr_epi8(vec_int, vec_int, 28);
    return _mm256_castsi256_ps(shifted_int);
}

效率说明

两种实现都仅需一条AVX2指令(现代CPU上单周期执行),无额外内存开销,完全满足高效要求。执行后data数组会变为{原8.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f},第一个元素符合你对X的任意值要求。

内容的提问来源于stack exchange,提问作者DNF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 14:13:13