我用AVX指令编写了非常简单的程序,但是当我使用-O3选项编译代码和g ++编译器的-O1选项时,我得到的结果不同,这是我的代码:
int main(int argc, char *argv[])
{
int d = 120;
__m256i r = _mm256_set1_epi32(d);
int * p = (int *) &r;
printf("r[0]: %d, ",p[0]);
printf("r[1]: %d, ",p[1]);
printf("r[2]: %d, ",p[2]);
printf("r[3]: %d, ",p[3]);
printf("r[4]: %d, ",p[4]);
printf("r[5]: %d, ",p[5]);
printf("r[6]: %d, ",p[6]);
printf("r[7]: %d \n",p[7]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我使用这些选项编译时的输出(g ++ test1.c -o test1 -m64 -O3 -ffast-math -march = native -mavx):
r [0]:0,r [1]:0,r [2]:4195520,r [3]:0,r [4]: - 1880829792,r [5]:32767,r [6]:0, r [7]:0
这是我用这些选项编译时的输出(g ++ test1.c -o test1 -m64 …
我正在尝试将一个向量加载到SSE寄存器中,我的代码编译没有错误,但是当我尝试运行它时,我有分段错误.这是我的代码:
inline int SSEJaccard::calcSSEJaccardDist(unsigned int id1, unsigned int id2) {
int result;
__m128i v, v1;
std::vector<uint32_t> &fv1 = fvs[id1];
std::vector<uint32_t> &fv2 = fvs[id2];
v = _mm_load_si128((__m128i const*) (&fv1));
v1 = _mm_load_si128((__m128i const*) (&fv2));
v = _mm_and_si128(v,v1);
result =_mm_extract_epi16(v, 0) + _mm_extract_epi16(v, 4);
return result;
}
Run Code Online (Sandbox Code Playgroud)
fsv是一个全局变量,定义如下:
std::vector<std::vector<uint32_t> > fvs;
Run Code Online (Sandbox Code Playgroud)
我正在使用英特尔编译器(ICC).谢谢