更新:看起来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