如何使用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
相关产品推荐
相关产品推荐

