使用AVX-512时GCC优化导致结果错误,Clang编译无此问题
GCC AVX-512优化引发程序输出错误,Clang无此问题
我最近碰到了一个和AVX-512指令集、GCC优化相关的棘手问题,折腾一番后确认是编译器的问题,跟大家分享下细节:
在使用AVX-512指令编写的代码中,只要开启GCC的优化选项(比如-O2、-O3,或是指定-mavx512f这类指令集编译选项),程序就会输出错误结果;但换成Clang++编译的话,不管用什么优化级别,程序都能稳定输出正确的288 288 288。
验证结论
- 反复测试后确认,GCC确实存在这个bug,优化开启后会破坏AVX-512相关代码的执行逻辑
- Clang++对AVX-512指令的优化处理没有问题,全优化级别下结果都符合预期
相关代码片段
#include<algorithm> #include<cstdint> #include<iostream> #include<emmintrin.h> #include<immintrin.h> #include<xmmintrin.h> using namespace std; #define LOADU_128(addr) _mm_loadu_si128(reinterpret_cast<const __m128i*>(addr)) void calc_x3(const uint8_t *ref,const int stride,const __m512i *enc) { __m512i ... // 此处省略具体的AVX-512指令实现逻辑 } // 测试用主函数示例 int main() { // 初始化测试输入数据 uint8_t ref[256] = {0}; int stride = 16; __m512i enc[8]; // 填充测试数据逻辑... // 调用AVX-512计算函数 calc_x3(ref, stride, enc); // 输出结果(预期值为288 288 288) cout << (int)ref[0] << " " << (int)ref[16] << " " << (int)ref[32] << endl; return 0; }
临时解决办法
如果暂时需要用GCC编译,可以试试这两个方案:
- 对
calc_x3函数添加__attribute__((optimize("O0")))属性,强制关闭该函数的优化 - 把AVX-512相关的代码模块单独用Clang++编译,再和其他GCC编译的代码链接
内容的提问来源于stack exchange,提问作者Caesar




