2015-04-26 6 views
5

मैं सिर्फ gcc (g ++) और compilerflags -msse और -msse2 के साथ खेल रहा हूं। जब मैंने इसे निम्न कथनों से संकलनसी/सी ++: -msse और -msse2 झंडे पर कोई प्रभाव नहीं पड़ता है?

#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 

और

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

उत्पादन फ़ाइलों द्विआधारी बराबर हैं मैं एक छोटे से परीक्षण कार्यक्रम जो कि तरह दिखता है। लेकिन मुझे उम्मीद है कि वे एसएमआईडी झंडे के कारण समान नहीं हैं।

तो मेरा सवाल यह है कि, क्या उन अनुपालन झंडे बाइनरी फ़ाइल पर कोई प्रभाव नहीं रखते हैं? मैंने इसे ओएस एक्स 10.10.3 और फेडोरा 21 पर परीक्षण किया है।

आपकी मदद के लिए धन्यवाद।

तरह का संबंध

फैबियन

+1

-msse और -msse2 x86_64 प्रोसेसर पर डिफ़ॉल्ट रूप से सक्षम हैं। यदि आप ऐसे प्रोसेसर पर निर्माण कर रहे हैं, तो यह समझ में आएगा कि उनके पास कोई प्रभाव नहीं है। – IanPudney

+4

वैसे भी करने के लिए कोई गणित नहीं है, आप केवल एक स्ट्रिंग और स्थिर – harold

+2

प्रिंट कर रहे हैं आप यह देखने के लिए जेनरेटेड असेंबली देख सकते हैं कि कोई भी निर्देश उपयोग किया जाता है या नहीं। –

उत्तर

4

अपने कोड में बहुत ही बुनियादी फ्लोटिंग बिंदु गणित शामिल है। और मैं शर्त लगाता हूं कि यदि आप ऑप्टिमाइज़ेशन चालू करते हैं (यहां तक ​​कि -O1) यह ऑप्टिमाइज़ हो जाता है क्योंकि वे मान निरंतर अभिव्यक्तियां हैं और संकलन-समय पर गणना योग्य हैं।

एसएसई का उपयोग किया जाता है (movss, mulss) क्योंकि यह फ़्लोटिंग पॉइंट कैलकुलेशन की सीमा है, अगर हम चाहते हैं। एसएसई 2 में कोई गुंजाइश नहीं है।
एसएसई 2 के लिए जगह खोजने के लिए आपको अधिक जटिल कैलकुस शामिल करना होगा जो एसएसई 2 में उपलब्ध कुछ निर्देशों का शोषण कर सकता है या नहीं; आप कुछ कर सकते हैं जो कुछ करते हैं, उनके समकक्ष करते हैं और देखते हैं कि संकलक उनका लाभ उठा सकता है या नहीं।

+1

तो अगर मैं वहां कुछ और "गणित" जोड़ता हूं, तो शायद कोई प्रभाव पड़ेगा? संकलन करते समय एसएसई 2 के "निष्क्रियकरण" के बारे में क्या है? – Fabian

+0

ऐसा हो सकता है। मुझे आपसे पूछने दो: शायद आप उस ध्वज को जोड़ने के बारे में चिंतित हैं, शायद धीमी संकलन के समय में? – edmz

+0

नहीं, यह केवल कंपाइलर behavoiour और संकलक झंडे की बेहतर समझ के लिए है। इसमें कुछ प्रयोगात्मक charachter है और मेरे एकमात्र पाठ्यक्रम के काम पर आधारित है। – Fabian

4

सबसे पहले आपको यह जानने की आवश्यकता है कि एसएसई 2 और एसएसई सक्षम हैं और डिफ़ॉल्ट रूप से 64-बिट कोड के लिए उपयोग किए जाते हैं। 32-बिट कोड के लिए डिफ़ॉल्ट x87 निर्देश था।

दूसरी बात आप जानना चाहते हैं कि डबल चल SSE2 की आवश्यकता है इसलिए यदि आप अपने उदाहरण में SSE और SSE2 के बीच एक अंतर आप नाव के साथ डबल की तुलना करनी चाहिए देखना चाहते है।

तीसरी चीज आपको जानने की जरूरत है कि कैसे अपने संकलन को अनुकूलित करने के लिए अपने कंपाइलर को मनाने के लिए है। एक तरह से यह करने के लिए इस तरह के कार्यों में अपने कोड रैप करने के लिए है:

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

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

तो g++ -O3 -S foo.cpp से पता चलता foof का उपयोग करता है mulssfood जबकि mulsd उपयोग करता है। आप यकीन है कि यह सही परिणाम हो रही है बनाना चाहते हैं आप तो g++ -O3 -c foo.cpp और फिर g++ -O3 main.cpp foo.o ऐसा करते हैं

//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; 
} 

की तरह में लिंक कर सकते हैं।

यदि आप एसएसई निर्देशों को अक्षम करना चाहते हैं तो -mfpmath=387 का उपयोग करें या -m32 के साथ 32-बिट मोड में संकलित करें।

संबंधित मुद्दे