我使用AVX指令编写了一个非常简单的程序,但是当我使用g++编译器的 -O3 选项和 -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;
}
这是我使用以下选项编译时的输出结果(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 -O1 -ffast-math -march=native -mavx):
r[0]: 120,r[1]: 120,r[2]: 120,r[3]: 120,r[4]: 120,r[5]: 120,r[6]: 120,r[7]: 120
第二个结果(-O1)是正确的,但第一个结果却是错误的。我不知道为什么会出现这种情况。
-fno-strict-aliasing
是否能解决问题?你的代码违反了 strict-aliasing 规则,但这不应该成为问题,因为 SSE/AVX 类型已声明为may_alias
。 - Mysticialgcc 4.9.2
)。 - edmzavxintrin.h
,其中__m256i
会被may_alias
定义为typedef
。 - user3079266