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

如何使用AVX512将每个32位数据通道的低8位存储至内存?

提取ZMM寄存器中32位整数的低8位并存储到int8_t数组

直接利用AVX-512的专用指令就能高效完成这个操作,以下是两种常见实现方式:

C语言intrinsics实现

这种方式可读性强,无需直接编写汇编:

#include <immintrin.h>
#include <stdint.h>

// zmm_data: 存储16个32位整数的ZMM寄存器
// dest: 目标int8_t数组,需至少预留16字节空间
void extract_low8bits(__m512i zmm_data, int8_t* dest) {
    // 将每个32位整数的低8位符号扩展为8位,打包成128位向量
    __m128i packed_bytes = _mm512_cvtepi32_epi8(zmm_data);
    // 若需无符号提取,替换为_mm512_cvtepu32_epi8
    _mm_storeu_si128((__m128i*)dest, packed_bytes);
}

x86-64汇编实现

追求极致性能可直接使用汇编指令:

# 输入:zmm0 = 包含16个32位整数的ZMM寄存器
#      rdi = 目标int8_t数组的起始地址
extract_low8:
    vpmovdb [rdi], zmm0  ; 把每个32位元素的低8位(带符号)打包存储到内存
    ; 无符号提取替换为vpmovub [rdi], zmm0
    ret

原理说明

  • VPMOVDB(带符号)和VPMOVUB(无符号)是AVX-512的专用打包指令,会遍历ZMM寄存器中的每个32位元素,提取其低8位,按顺序压缩成字节流后直接写入目标内存。16个32位元素刚好对应16字节,一次指令即可完成全部操作,效率极高。
  • 编译时需开启AVX-512支持(比如GCC添加-mavx512f编译选项)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:10:12