You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动