2012-10-16 27 views
5

मुझे फ्लोटिंग पॉइंट नंबर और पूर्णांक के बीच रूपांतरण करते समय होने वाली त्रुटियों से अवगत है, लेकिन प्रदर्शन के बारे में क्या है (कृपया सटीकता के मुद्दों को नजरअंदाज करें)?फ़्लोटिंग पॉइंट रूपांतरण और प्रदर्शन

चल बिन्दु भिन्न प्रकार (जैसे float और double) और चल बिन्दु/पूर्णांक प्रकार संयोजन (जैसे float पर, वह यह है कि, प्रदर्शन करता है सामान्य रूप में, अगर मैं गणित भिन्न प्रकार की ऑपरेंड पर n-ary कार्य कर ग्रस्त हैं और int)? अंगूठे के नियम मौजूद हैं, जैसे कि सभी ऑपरेटरों को एक ही प्रकार के रखने के लिए?

पीएस .: मैं पूछ रहा हूं क्योंकि मैं एक अभिव्यक्ति टेम्पलेट लाइब्रेरी लिख रहा हूं और यह जानना चाहता हूं कि विभिन्न अंकगणितीय प्रकारों के मूल्य वाले वैक्टरों पर द्विआधारी संचालन की अनुमति है या नहीं।

+1

हां, विभिन्न प्रकारों के बीच कनवर्ट करने की लागत है। अगर मैं अपने मध्यकाल से वापस आ जाता हूं तो कोई और गहराई से जवाब नहीं दे सकता है। – Mysticial

+0

चूंकि फ्लोटिंग-पॉइंट ऑपरेशंस बेस-2 अंकगणितीय के मामले में गैर-तुच्छ हैं, इसलिए कंपाइलर्स अक्सर सहायक कार्यों को उत्सर्जित करते हैं (देखें कि libgcc की आवश्यकता क्यों है?) और इससे प्रदर्शन को गंभीरता से प्रभावित किया जा सकता है। –

+0

बात यह है कि, आपका प्रोग्राम ** ** ** अलग-अलग प्रकार के संचालन पर एन-आरी ऑपरेशन करता है। यह तर्क के अनुसार तर्क को बढ़ावा देता है सी 99 की 6.3.1।8 सामान्य अंकगणितीय रूपांतरण, और फिर एन-आरी ऑपरेशन होता है, आमतौर पर उसी प्रकार के तर्क के साथ (कुछ अपवाद हैं लेकिन कोई भी जिसमें फ़्लोटिंग-पॉइंट प्रकार शामिल नहीं हैं)। –

उत्तर

5

मुझे संदेह है कि इस प्रश्न का उत्तर लक्ष्य आर्किटेक्चर द्वारा भिन्नता जा रहा है, क्योंकि रूपांतरण हार्डवेयर में हो सकता है (लेकिन हो सकता है)। उदाहरण के लिए, निम्नलिखित कोड है, जो पूर्णांक और नाव के बीच कुछ interconversions का कारण बनता है पर विचार करें:

int main (int argc, char** argv) 
{ 
    int precoarced = 35; 
    // precoarced gets forced to float 
    float result = 0.5 + precoarced; 

    // and now we force it back to int 
    return (int)result; 

    // I wonder what the disassembly looks like in different environments? 
} 

जब मैं जी के साथ इस संकलन करने की कोशिश की ++ डिफ़ॉल्ट सेटिंग के साथ (मैं Ubuntu, 86 पर हूँ), और gdb इस्तेमाल किया डिसअसेंबल करने का :

0x00000000004004b4 <+0>: push %rbp 
    0x00000000004004b5 <+1>: mov %rsp,%rbp 
    0x00000000004004b8 <+4>: mov %edi,-0x14(%rbp) 
    0x00000000004004bb <+7>: mov %rsi,-0x20(%rbp) 
    0x00000000004004bf <+11>: movl $0x23,-0x8(%rbp) 
    0x00000000004004c6 <+18>: cvtsi2sdl -0x8(%rbp),%xmm0 
    0x00000000004004cb <+23>: movsd 0x10d(%rip),%xmm1  # 0x4005e0 
    0x00000000004004d3 <+31>: addsd %xmm1,%xmm0 
    0x00000000004004d7 <+35>: unpcklpd %xmm0,%xmm0 
    0x00000000004004db <+39>: cvtpd2ps %xmm0,%xmm0 
    0x00000000004004df <+43>: movss %xmm0,-0x4(%rbp) 
    0x00000000004004e4 <+48>: movss -0x4(%rbp),%xmm0 
    0x00000000004004e9 <+53>: cvttss2si %xmm0,%eax 
    0x00000000004004ed <+57>: pop %rbp 
    0x00000000004004ee <+58>: retq 

एक सीवीटी-प्रीफिक्स्ड निमोनिक के साथ निर्देशों को नोट करें। ये रूपांतरण निर्देश हैं। तो इस मामले में, कुछ हद तक निर्देशों में हार्डवेयर में रूपांतरण हो रहा है। तो, इन निर्देशों के कितने चक्रों के आधार पर, यह उचित रूप से तेज़ हो सकता है। लेकिन फिर, एक अलग वास्तुकला (या अलग संकलक) कहानी बदल सकता है।

संपादित करें: एक मजेदार साइड नोट पर, मुझे 0.5f के बजाय गलती से 0.5 निर्दिष्ट करने के कारण वहां एक अतिरिक्त रूपांतरण है। यही कारण है कि cvtpd2ps op वहां है।

संपादित करें: x86 के पास लंबे समय तक (80 के दशक से) एफपी समर्थन था, इसलिए x86 को लक्षित करने वाले सी ++ कंपाइलर्स आम तौर पर हार्डवेयर का उपयोग करेंगे (जब तक कि संकलक समय के पीछे गंभीरता से न हो)। इस बात को इंगित करने के लिए धन्यवाद हॉट लिक्स।

+0

संकलक संकलन समय पर रूपांतरण करने के लिए पर्याप्त स्मार्ट हो सकता था, लेकिन यह नहीं था ... – user1095108

+0

@ user1095108 दरअसल। यह मुझे बहुत ज्यादा आश्चर्य नहीं करता है; मैं एक के लिए डिफ़ॉल्ट सेटिंग्स पर था। इस तरह एक शाब्दिक के रूप में फ्लोट होने के कारण एक ठेठ 'व्यावहारिक' उपयोग मामला नहीं है। इसके अलावा, कंपाइलर कार्यान्वयनकर्ता शायद किसी भी फ्लोट से संबंधित अनुकूलन से डरते हैं क्योंकि उन्हें * बहुत सावधान रहना होगा। उदाहरण के लिए, आपको लगता है कि अतिरिक्त की अनुकूलता (ए + बी = बी + ए) फ्लोट अतिरिक्त अनुकूलन के लिए एक वैध आधार होगा, लेकिन एफपी अपर्याप्तता के कारण यह नहीं है; यह कुछ एफपी एल्गोरिदम की परिशुद्धता को तोड़ सकता है। – WeirdlyCheezy

+0

ध्यान दें कि मूल 8087 कॉप्रोसेसर के बाद रूपांतरण निर्देश एक रूप में या किसी अन्य रूप में रहे हैं। तो फ्लोटिंग-पॉइंट हार्डवेयर वाले लगभग सभी सिस्टम में हार्डवेयर में रूपांतरण होंगे। –

2

अधिकांश मशीनों पर, फ्लोटिंग और इंट प्रारूपों के बीच रूपांतरण काफी तेज है, फ्लोटिंग-पॉइंट हार्डवेयर की सुविधाओं द्वारा सहायता प्राप्त की जा रही है।

हालांकि, अगर किसी को दस्तावेज उद्देश्यों के लिए, "सही" प्रारूप में शाब्दिक अभिव्यक्ति करने के लिए कुछ प्रयास करना चाहिए। और दस्तावेज के लिए, स्पष्ट रूप से स्पष्ट जानवरों का उपयोग करने में कोई दिक्कत नहीं होती है।

2

आमतौर पर कुछ प्रदर्शन दंड होते हैं, हालांकि अन्य चीजों की तुलना में नगण्य। यह अभिन्न और फ़्लोटिंग-पॉइंट रजिस्टरों और अन्य संभावित एबीआई मुद्दों के बीच डेटा माइग्रेशन के कारण है।

ऐसे प्रश्नों का उत्तर हमेशा समान होता है। शक में? इसे बेंचमार्क करें। प्रदर्शन शायद ही सैद्धांतिक रूप से अनुमानित है।

+2

मत भूलना, कि मैंने अंगूठे के नियमों के बारे में पूछा है। मैं बेंच नियम से अवगत हूं। – user1095108

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