C语言使用intrinsic从两个m256i构造填充zmm寄存器的最优方案
C语言AVX512 intrinsic拼接两个__m256i为__m512i的最优实现
需求规则:低位ymm0放zmm低256位,高位ymm1放zmm高256位,最终拼接为单个__m512i类型变量。
两种等价最优实现
两种写法在O2及以上优化等级下,都会生成同一条最优指令vinserti64x4 zmm0, zmm0, ymm1, 0x1,延迟3周期、吞吐量1周期/指令,是当前硬件支持的最高性能方案。
写法1:简洁构造写法
代码可读性最高,编译器自动完成优化:
#include <immintrin.h> __m256i ymm0 = ...; // 低位256位向量 __m256i ymm1 = ...; // 高位256位向量 // 参数顺序为 低位在前、高位在后 __m512i zmm0 = _mm512_setr_m256i(ymm0, ymm1);
写法2:显式复用低位写法
完全匹配你提到的「ymm0本身是zmm0低位」的特性:
#include <immintrin.h> __m256i ymm0 = ...; __m256i ymm1 = ...; // 纯编译期类型转换,无任何运行时开销,直接把ymm0作为zmm的低256位 __m512i zmm0 = _mm512_castsi256_si512(ymm0); // 将ymm1插入到zmm的第1个256位块(即高256位),imm参数固定为1 zmm0 = _mm512_inserti64x4(zmm0, ymm1, 1);
补充说明
你提到的直接复用ymm0作为zmm低位的特性,在C intrinsic中就是通过
_mm512_castsi256_si512实现的,这个接口没有对应的机器指令,仅在编译期修改类型标识,完全零开销。
编译时需要开启AVX512F指令集支持,GCC/Clang对应参数为-mavx512f,ICC对应参数为/QxAVX512F。
内容的提问来源于stack exchange,提问作者bumpbump
相关产品推荐
相关产品推荐

