更新:似乎 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 240
288
g++ -std=c++17 -march=native -O1 main.cpp
t512[i+1]=_mm512_sad_epu8(t512[7],enc[j]);
240 0
240