2015-04-26 33 views
5

Sadece gcc (g ++) ve compilerflags -msse ve -msse2 ile oynuyorum. Ben şu ifadelere derlemek zamanC/C++: -msse ve -msse2 Bayrakların ikili dosyalar üzerinde herhangi bir etkisi yok mu?

#include <iostream> 

int main(int argc, char **argv) { 
    float a = 12558.5688; 
    float b = 6.5585; 

    float result = 0.0; 

    result = a * b; 

    std::cout << "Result: " << result << std::endl; 

    return 0; 
} 

:

/usr/local/bin/g++-4.9 -W -msse main.cpp -o testsse 

ve

/usr/local/bin/g++-4.9 -W -msse2 main.cpp -o testsse2 

çıktı dosyaları eşit ikili I benziyor küçük bir test programı var. Ancak SMID bayrakları nedeniyle aynı olmadıklarını tahmin ettim.

Benim sorum şu ki, bu karşılaştırıcı bayrakların ikili dosya üzerinde herhangi bir etkisi yok mu? Bunu OS X 10.10.3 ve Fedora 21.

'da denedim. Yardımlarınız için teşekkürler.

Tür çok temel kayan nokta matematik katılır Kodunuzda

Fabian

+1

-msse ve -msse2, x86_64 işlemcilerinde varsayılan olarak etkindir. Eğer böyle bir işlemci üzerinde çalışıyorsanız, o zaman bunların hiçbir etkisi olmayacaktır. – IanPudney

+4

Zaten burada yapacak herhangi bir matematik yok, sadece bir dize ve sabit bir baskı yapıyorsunuz – harold

+2

Talimatlardan herhangi birinin kullanılıp kullanılmadığını görmek için oluşturulan birime bakabilirsiniz. –

cevap

4

görüyor. Ve bahse girerim optimizasyonları (hatta -O1) açarsanız, bu değerler optimize edilir çünkü bu değerler sabit ifadelerdir ve derleme zamanında hesaplanabilir.

SSE, (movss, mulss) kullanılır, çünkü istersek, kayan nokta hesabı eşiği olur. SSE2'nin kapsamı yok.
SSE2 için yer bulmak için SSE2'de mevcut olan bazı talimatları kullanabilecek veya kullanmayacak daha karmaşık hesaplamalar eklemeniz gerekir; Bazılarının yaptıklarına bakabilir, eşdeğerlerini yapabilir ve derleyicinin bunlardan faydalanıp yararlanamayacağını görebilirsiniz.

+1

Eğer daha fazla "matematik" eklerseniz, bir etkisi olabilir mi? Derleme sırasında sse2'nin "devre dışı bırakılması" ile ilgili nedir? – Fabian

+0

Böyle olabilir. Sana sormama izin ver: belki o bayrağı eklemeye çalışmaktan endişeleniyorsun, belki daha yavaş derlenme zamanlarında? – edmz

+0

Hayır, sadece derleyici behavoiour ve derleyici bayrakları daha iyi anlamak içindir. Bazı deneysel charachter var ve benim genel ders çalışmasına dayanıyor. – Fabian

4

Bilmeniz gereken ilk şey, SSE2 ve SSE'nin 64 bit kod için varsayılan olarak etkinleştirilmesi ve kullanılmasıdır. 32 bit kod için varsayılan x87 yönergeleriydi.

Bilmeniz gereken ikinci şey, çift yüzdürmenin SSE2 gerektirdiğinden, örneğinizde SSE ve SSE2 arasında bir fark görmek isterseniz, float ile çift karşılaştırmalısınız.

Bilmeniz gereken üçüncü şey, derleyicinizi hesaplamalarınızı en uygun hale getirmemek için nasıl ikna edeceğinizdir. Bunu yapmanın bir yolu, bu gibi işlevler kodunuzu sarılmasıdır:

//foo.cpp 
float foof(float x, float y) { 
    return x*y; 
} 

double food(double x, double y) { 
    return x*y; 
} 

sonra g++ -O3 -S foo.cpp foof mulsd kullanır mulss food oysa kullandığı gösterir. Eğer bunun doğru sonuçlar elde emin olmak istiyorsanız Sonra g++ -O3 -c foo.cpp ve sonra g++ -O3 main.cpp foo.o yapmak bu

//main.cpp 
#include <iostream> 
extern float foof(float, float); 
extern double food(double, double); 

int main(void) { 
    float af = 12558.5688; 
    float bf = 6.5585; 
    float resultf = 0.0; 

    double ad = af; 
    double bd = bf; 
    double resultd = 0.0; 

    resultf = foof(af, bf); 
    resultd = food(ad, bd); 

    std::cout << "Resultf: " << resultf << " Resultd: " << resultd << std::endl; 
} 

gibi içinde bağlayabilirsiniz.

SSE yönergelerini devre dışı bırakmak istiyorsanız, -mfpmath=387 kullanın veya -m32 ile 32 bit modunda derleyin.