0

更新:似乎 gcc 在这里真的有问题。288 288 288无论使用 clang++ 编译时使用什么优化选项,我都会得到。

这是我的代码。

#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.
但是我在编译时得到. 另外,如果我注释该行,我会在 O1 标志编译时得到。(为什么第三个答案变成240???) gcc 这里有问题吗?还是我的问题? 顺便说一句,如果您对此问题有一个好的标题,请告诉我。 以下是我的机器信息。 CPU i7-7820X gcc 版本 7.3.1 20180312 (GCC) clang 版本 6.0.0 (tags/RELEASE_600/final) 目标:x86_64-pc-linux-gnu Linux 4.15.14-1-ARCH #1 SMP PREEMPT240 240288g++ -std=c++17 -march=native -O1 main.cpp
t512[i+1]=_mm512_sad_epu8(t512[7],enc[j]);240 0240







4

0 回答 0