使用avx 512时,gcc optimize会导致错误答案

时间:2018-04-04 15:34:35

标签: gcc optimization intel intrinsics avx512

更新:看起来gcc确实存在问题。 无论我在使用clang ++进行编译时使用哪种优化选项,我都会获得288 288 288

这是我的代码。

#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 t512[9];
    for(int i(0);i!=9;++i)
        t512[i]=_mm512_setzero_si512();
    const auto stridex2(stride*2);
    auto next_line(ref+stride);
    for(int i(0),j(0);i!=6;i+=3,++j)
    {
        t512[6]=_mm512_inserti64x2(_mm512_castsi128_si512(LOADU_128(ref)),LOADU_128(next_line),1);
        t512[7]=_mm512_inserti64x2(_mm512_castsi128_si512(LOADU_128(ref+1)),LOADU_128(next_line+1),1);
        t512[8]=_mm512_inserti64x2(_mm512_castsi128_si512(LOADU_128(ref+2)),LOADU_128(next_line+2),1);
        ref+=stridex2;
        next_line+=stridex2;
        t512[6]=_mm512_inserti64x4(t512[6],_mm256_inserti64x2(_mm256_castsi128_si256(LOADU_128(ref)),LOADU_128(next_line),1),1);
        t512[7]=_mm512_inserti64x4(t512[7],_mm256_inserti64x2(_mm256_castsi128_si256(LOADU_128(ref+1)),LOADU_128(next_line+1),1),1);
        t512[8]=_mm512_inserti64x4(t512[8],_mm256_inserti64x2(_mm256_castsi128_si256(LOADU_128(ref+2)),LOADU_128(next_line+2),1),1);
        ref+=stridex2;
        next_line+=stridex2;
        t512[i+0]=_mm512_sad_epu8(t512[6],enc[j]);
        t512[i+1]=_mm512_sad_epu8(t512[7],enc[j]);
        t512[i+2]=_mm512_sad_epu8(t512[8],enc[j]);
    }
    cout<<_mm512_reduce_add_epi32(t512[3])<<endl;
    cout<<_mm512_reduce_add_epi32(t512[4])<<endl;
    cout<<_mm512_reduce_add_epi32(t512[5])<<endl;
}

int main()
{
    constexpr int width(18);
    constexpr int height(8);
    uint8_t pic[width*height];
    for(int i(0);i!=height;++i)
        fill_n(pic+width*i,width,i);
    __m512i cmp[2];
    cmp[0]=_mm512_set1_epi8(0);
    cmp[1]=_mm512_set1_epi8(1);
    calc_x3(pic,width,cmp);
}

288 288 288进行编译时,我得到g++ -std=c++17 -march=native main.cpp 但是在按240 240进行编译时,我得到 288 g++ -std=c++17 -march=native -O1 main.cpp
另外,如果我对该行t512[i+1]=_mm512_sad_epu8(t512[7],enc[j]);发表评论,我会在按O1标志进行编译时获得240 0 240 。 (为什么第三个答案改为 240 ???)
gcc在这里有问题吗?或者这是我的问题?

顺便说一下,如果你有这个问题的好标题,请告诉我 以下是我的机器信息 CPU i7-7820X
gcc版本7.3.1 20180312(GCC)
clang 6.0.0版(标签/ RELEASE_600 / final)目标:x86_64-pc-linux-gnu
Linux 4.15.14-1-ARCH#1 SMP PREEMPT

0 个答案:

没有答案