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

GCC编译AVX512代码报_mm512_mask_i32logather_pd未声明问题

问题现象

代码库包含AVX512 intrinsic指令,原使用Intel编译器可正常构建,切换GNU编译器编译时,添加-mavx512f参数后仅部分AVX512指令(如_mm512_mask_i32logather_pd)出现声明错误。相同代码使用ICC添加-xCORE-AVX512参数可正常编译运行。

独立复现代码
#include <iostream>
#include <immintrin.h>

int main() {
    __m512d set = _mm512_undefined_pd();
    __mmask16 msk = 42440;
    __m512i v_index = _mm512_set_epi32(64,66,70,96,98,100,102,104,106,112,114,116,118,120,124,256);
    int scale = 8;
    int count_size = 495*4;
    float *src_ptr = (float*)malloc(count_size*sizeof(float));
    __m512 out_512 = (__m512)_mm512_mask_i32logather_pd(set, msk, v_index, (float*)src_ptr, _MM_SCALE_8);
    return 0;
}
GCC编译报错信息
error: ‘_mm512_mask_i32logather_pd’ was not declared in this scope; did you mean ‘_mm512_mask_i32gather_pd’?
相关环境信息
  • GCC版本:11.2.0
  • Ubuntu版本:22.04
  • ICC版本:2021.6.0
问题原因

出现该问题不是GCC加了-mavx512f仍不支持全部AVX512指令,核心原因有两点:

  1. -mavx512f仅开启AVX512 Foundation(基础指令集),AVX512是多个指令子集的统称,除基础集外还包含AVX512DQ、AVX512VL、AVX512CD、AVX512BW等多个扩展子集,用到对应子集的指令时必须额外添加对应的-mavx512xxx编译参数,不会因为开启基础集就默认支持所有AVX512相关指令。
  2. 报错的_mm512_mask_i32logather_pd不是跨编译器通用的标准intrinsic命名,属于ICC提供的历史兼容别名,对应功能和AVX512F标准指令集中的_mm512_mask_i32gather_pd完全一致,GCC没有实现这组ICC专属的lo/hi后缀gather别名,因此会报未声明错误,GCC给出的修正提示是准确的。
修复方案
  • 直接将代码中的_mm512_mask_i32logather_pd替换为_mm512_mask_i32gather_pd即可,参数不需要修改,运行表现和ICC环境下完全一致。
  • 修正代码中的类型强转错误:_mm512_mask_i32gather_pd返回值类型为__m512d(512位双精度浮点向量),不需要强转为__m512(512位单精度浮点向量),错误的类型强转会触发后续的类型不匹配编译错误。
  • 若后续编译仍遇到其他AVX512 intrinsic未声明的问题,先确认该intrinsic所属的AVX512子集,在编译参数中补充对应选项即可,例如使用AVX512DQ指令就添加-mavx512dq,使用AVX512VL指令就添加-mavx512vl。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:09:18