2010-07-23 14 views
81

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

+0

यदि यह एआरएम आर्किटेक्चर है तो कृपया इसे टैग में रखें :-) –

+3

@Nils Pipenbrinck: एमआईपीएस चिप्स में भी यह समस्या है – Javier

उत्तर

81

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

+0

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

10

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

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

28

वहाँ चल बिन्दु गणित करने के लिए तीन तरीके हैं:

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

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

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

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

11

कड़ाई से बोलते हुए, ये सभी उत्तर मेरे लिए गलत लगते हैं।

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

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

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

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

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

Armv5 shared library with ArmV7 CPU इस एक के विपरीत है; libc कठिन नाव था, लेकिन आवेदन केवल नरम था। इस मुद्दे के आसपास काम करने के कुछ तरीके हैं, लेकिन सही विकल्पों के साथ पुन: संकलन हमेशा सबसे आसान है।

एक और मुद्दा यह है कि लिनक्स कर्नेल VFP कार्य (या जो भी एआरएम चल बिन्दु मौजूद है) एक संदर्भ स्विच पर बचाने के लिए/रजिस्टर बहाल समर्थन करना चाहिए है।

+0

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

+0

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

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