2014-06-24 4 views
1

에서 SSE를 사용하지 않습니다 사용하고, 그렇지 않은 GCC는 SSE 사용하지 않는 것이 매우 이상하다 그래서 코드 결과 정확히 같은 코드는 플래그없이 gcc myfile.c 내 코드에서GCC는 리눅스 64에서 32 비트

할 많은 배열 연산과 부동 소수점의 행렬을 생성 기본 컴파일과 비교하여 최적화를 수행하십시오.

왜? 이것은 컴파일러의 버그입니까?

편집

내가 플래그 -msse2 또한 컴파일러 사용 SSE 명령어를 추가 할 수 있지만 march=native 따라서 또한 현재 CPU SSE2가 지원하는 모든 명령을 포함해야합니다. 왜 이런 일이 일어 났습니까?

+1

'-msse2'를 추가 할 수 있습니다. –

+0

march = native를 사용하는 경우 활성화되어 있지 않습니까? – AndreaF

+0

나는 잘 모르겠다. 나는 방금 시도해 볼만한 가치가 있다고 생각했다. –

답변

0

저의 경우 gcc 4.9.2에서 작동합니다. (우분투 AMD64)

// fp-simple.c 
double fp_func (double a, double b) 
{ 
     return a*b + 32; 
} 

gcc -m32 -march=native -ftree-vectorize -S -o- :

blah blah a lot of mov insns because we didn't use -O3 
    fldl -8(%ebp) 
    fmull -16(%ebp) 
    fldl .LC0 
    faddp %st, %st(1) 
    leave 
    ret 

gcc -m32 -march=native -mfpmath=sse -ftree-vectorize -S -o- fp-simple.c :

mov ... copy from args to locals on the stack 
    vmovsd -8(%ebp), %xmm0 
    vmulsd -16(%ebp), %xmm0, %xmm1 
    vmovsd .LC0, %xmm0 
    vaddsd %xmm0, %xmm1, %xmm0 
    vmovsd %xmm0, -24(%ebp) 
    fldl -24(%ebp) 
    leave 
    ret 

(. -march=nehalem와 함께, 당신은 동일한 코드를 얻을 수 있지만, SSE 명령어의 비 VEX 버전)

그래서 gcc4.8이 이와 같이 동작하지 않으면 lik 버그.