हार्ड और सॉफ्ट फ्लोटिंग पॉइंट नंबरों में क्या अंतर है?


98

जब मैं अपने क्रॉस टूलचैन के साथ सी कोड संकलित करता हूं, तो लिंकर चेतावनी के पन्नों को यह कहते हुए प्रिंट करता है कि मेरा निष्पादन योग्य हार्ड फ्लोट का उपयोग करता है लेकिन मेरा लीवर सॉफ्ट फ्लोट का उपयोग करता है। क्या फर्क पड़ता है?


अगर यह ARM आर्किटेक्चर है तो कृपया इसे टैग्स में डाल दें :-)
Nils Pipenbrinck

3
@ निल्स पिपेनब्रिनक: एमआइपीएस चिप्स में यह मुद्दा भी है
जेवियर

जवाबों:


100

हार्ड फ्लोट्स ऑन-चिप फ्लोटिंग पॉइंट यूनिट का उपयोग करते हैं। सॉफ्ट फ्लोट्स सॉफ्टवेयर में एक का अनुकरण करते हैं। अंतर गति है। यह देखने के लिए अजीब है कि दोनों एक ही लक्ष्य वास्तुकला पर उपयोग किए जाते हैं, क्योंकि चिप में या तो एफपीयू है या नहीं। आप GCC में सॉफ्ट फ्लोटिंग पॉइंट को -msoft-float के साथ सक्षम कर सकते हैं। यदि आप इसका उपयोग करते हैं तो आप हार्डवेयर फ़्लोटिंग पॉइंट का उपयोग करने के लिए अपने libc को फिर से जोड़ना चाहते हैं।


3
"यह एक ही लक्ष्य वास्तुकला पर उपयोग किए गए दोनों को देखने के लिए अजीब है" यह पुस्तकालय के लिए मशीन-स्वतंत्र और बिट-सटीक (सॉफ्ट फ्लोट) सटीकता-महत्वपूर्ण भागों में और तेज (हार्ड फ्लोट) उन हिस्सों में हो सकता है जहां छोटे विचलन डॉन करते हैं 'बात नहीं।
फिललैब

यह 32-बिट एआरएम पर होता है।
हारून फ्रेंक

31

फ्लोटिंग पॉइंट अंकगणित को करने के तीन तरीके हैं:

  • यदि आपके CPU में FPU है तो फ्लोट निर्देशों का उपयोग करें। (तेज)
  • अपने संकलक का अनुवाद फ्लोटिंग पॉइंट अंकगणित से पूर्णांक अंकगणित में करें। (धीमा)
  • बिना एफपीयू वाले फ्लोट निर्देशों और सीपीयू का उपयोग करें। आपका CPU एक अपवाद (आरक्षित निर्देश, अनइम्प्लीमेंटेड इंस्ट्रक्शन या समान) उत्पन्न करेगा, और यदि आपके OS कर्नेल में एक फ्लोटिंग पॉइंट एमुलेटर शामिल है तो यह उन निर्देशों (सबसे धीमे) का अनुकरण करेगा।

23

कड़े शब्दों में, ये सभी जवाब मुझे गलत लगते हैं।

जब मैं अपने क्रॉस टूलचैन के साथ सी कोड संकलित करता हूं, तो लिंकर चेतावनी के पन्नों को यह कहते हुए प्रिंट करता है कि मेरा निष्पादन योग्य हार्ड फ्लोट का उपयोग करता है लेकिन मेरा लीवर सॉफ्ट फ्लोट का उपयोग करता है। क्या फर्क पड़ता है?

डेबियन VFP विकी के लिए तीन विकल्पों पर जानकारी है -mfloat-abi,

  • soft - यह शुद्ध सॉफ्टवेयर है
  • softfp- यह एक हार्डवेयर FPU का समर्थन करता है, लेकिन ABI नरम संगत है।
  • hard- ABI फ्लोट या VFP रजिस्टरों का उपयोग करता है ।

लिंकर (लोडर) त्रुटि है, क्योंकि आपके पास एक साझा पुस्तकालय है जो पूर्णांक मानों में फ्लोटिंग पॉइंट वैल्यू पास करेगा। आप अभी भी एक -mfpu=vfpआदि के साथ अपने कोड को संकलित कर सकते हैं , लेकिन आपको इसका उपयोग करना चाहिए -mfloat-abi=softfpताकि यदि libc को एक फ्लोट की आवश्यकता हो तो इसे लाइब्रेरी को समझने के तरीके से पारित किया जाए।

लिनक्स कर्नेल VFP निर्देशों के अनुकरण का समर्थन कर सकता है। जाहिर है, आप -mfpu=noneइस मामले के लिए संकलित करने के लिए बेहतर हैं और किसी भी लिनक्स कर्नेल अनुकरण पर भरोसा करने के बजाय सीधे कोड उत्पन्न करते हैं। हालाँकि, मुझे नहीं लगता कि ओपी की त्रुटि वास्तव में इस मुद्दे से संबंधित है। यह अलग है और इसके साथ भी निपटा जाना चाहिए -mfloat-abi

आरएमवी 7 सीपीयू के साथ आर्मव 5 साझा पुस्तकालय इस एक के विपरीत है; libc कठिन नाव था, लेकिन आवेदन केवल था नरम । इस मुद्दे के आसपास काम करने के कुछ तरीके हैं, लेकिन सही विकल्पों के साथ फिर से जुड़ना हमेशा सबसे आसान होता है।

एक अन्य मुद्दा यह है कि एक संदर्भ स्विच पर रजिस्टरों को बचाने / पुनर्स्थापित करने के लिए लिनक्स कर्नेल को वीएफपी कार्यों (या जो भी एआरएम फ़्लोटिंग पॉइंट मौजूद है) का समर्थन करना चाहिए।


1
आधुनिक जीसीसी (~ 4.8 +) संस्करण 'बहु-लिबास' का समर्थन करते हैं, जिसमें हार्ड फ्लोट और सॉफ्ट फ्लोट लाइब्रेरी हैं। पहले के संस्करणों के लिए आवश्यक था कि आपके पास एक विशिष्ट संस्करण के साथ निर्मित कंपाइलर हो। कभी-कभी 'बहु-लिबास' जीसीसी वितरण के साथ लिंक करते समय सही पुस्तकालय के लिए पथ की आवश्यकता होती है क्योंकि पुस्तकालयों के कई संस्करण होते हैं (संकलक बनाने के लिए अधिक समय की आवश्यकता होती है)। निर्देशिका के नाम 'hf', 'hardf', 'libhf' या 'hard-float' हो सकते हैं, लेकिन वे आमतौर पर नियमित 'soft' डायरेक्टरी या आस-पास के स्थान के अंतर्गत होते हैं।
कलाहीन शोर

यह सही जवाब है। फ्लोट के लिए कॉलिंग रूपांतरण को आपके कोड और libc के बीच मेल खाना चाहिए। यह अभी भी एक बेमेल के साथ काम कर सकता है, अगर आप कभी भी किसी फ्लोटिंग पॉइंट एफबीआईसी फ़ंक्शन को नहीं कहते हैं।
Tor Klingberg

13

ऐसा लगता है कि आपका libc सॉफ़्टवेयर फ़्लोटिंग पॉइंट ऑपरेशंस के लिए बनाया गया था, जबकि आपके exe को फ़्लोटिंग पॉइंट के लिए हार्डवेयर समर्थन मानकर संकलित किया गया था। अल्पावधि में, आप संकलक ध्वज के रूप में नरम फ़्लोट को बाध्य कर सकते थे। (यदि आप gcc का उपयोग कर रहे हैं तो मुझे लगता है कि यह -msoft-float है)

लंबे समय तक, यदि आपके लक्ष्य के प्रोसेसर में फ्लोटिंग पॉइंट ऑपरेशंस के लिए हार्डवेयर सपोर्ट है, तो आप आम तौर पर गति के लिए सक्षम हार्डवेयर फ्लोट के साथ एक क्रॉस टूलचैन बनाना या ढूंढना चाहेंगे। कुछ प्रोसेसर परिवारों के पास कुछ मॉडल हैं और कुछ हार्डवेयर समर्थन के बिना हैं। इसलिए, उदाहरण के लिए, बस यह कहना कि आपका प्रोसेसर एआरएम है यह जानने के लिए अपर्याप्त है कि क्या आपके पास हार्डवेयर फ्लोटिंग पॉइंट सपोर्ट है।


8

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.