2008-11-27 12 views
11

पर जाने पर फ़्लोटिंग-पॉइंट परिशुद्धता मेरे पास एक ऐसा एप्लिकेशन है जो लिनक्स x86 32 बिट्स के लिए विकसित किया गया था। परिणामों के आधार पर बहुत सारे फ़्लोटिंग-पॉइंट ऑपरेशंस और बहुत सारे परीक्षण हैं। अब हम इसे x86_64 पर पोर्ट कर रहे हैं, लेकिन परीक्षण के परिणाम इस आर्किटेक्चर में अलग हैं। हम प्रत्येक वास्तुकला के परिणामों का एक अलग सेट नहीं रखना चाहते हैं।i386 से x86_64

लेख An Introduction to GCC - for the GNU compilers gcc and g++ समस्या के अनुसार कि x86_64 में जीसीसी मान लिया गया fpmath = SSE जबकि 86 fpmath = 387 मान लिया गया है। 387 एफपीयू सभी कार्यों के लिए 80 बिट आंतरिक परिशुद्धता उपयोग करता है और केवल एक दिया फ्लोटिंग प्वाइंट प्रकार (नाव, डबल या लंबी डबल) के परिणाम में परिवर्तित करते हुए SSE अपने आंतरिक परिशुद्धता निर्धारित करने के लिए ऑपरेंड के प्रकार उपयोग करता है।

मैं बल -mfpmath = 387 मेरे अपने कोड संकलन और मेरे सभी कार्यों को सही ढंग से काम करते हैं, लेकिन जब भी मैं कुछ पुस्तकालय समारोह (sin, cos, atan2, आदि) फोन परिणाम फिर से गलत हैं जब। मुझे लगता है कि यह इसलिए है क्योंकि libm fpmath ओवरराइड के बिना संकलित किया गया था।

मैं libm अपने आप (glibc) के निर्माण के लिए 387 अनुकरण उपयोग करने की कोशिश, लेकिन यह कारण होने वाले क्रैश का एक बहुत चारों ओर (अगर मैंने कुछ गलत किया था पता नहीं है)।

वहाँ x86_64 में 387 अनुकरण का उपयोग करने के लिए एक प्रक्रिया में सभी कोड के लिए मजबूर करने के लिए एक रास्ता है? या शायद कुछ लाइब्रेरी जो libm के समान मान लौटाती हैं दोनों आर्किटेक्चर पर करती है? कोई सुझाव?

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

उत्तर

17

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

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

आप पूरी तरह करते हैं जरूरत 80-बिट परिशुद्धता? (हां, तो वहाँ स्पष्ट रूप से कई विकल्प, अन्य सब कुछ संकलित करने के लिए की तुलना में नहीं हैं, तो अपने आप को 80-बिट एफपी उपयोग करने के लिए।)

अन्यथा, कुछ छोटे एप्सिलॉन भीतर तुलना और समानता परीक्षण करने के लिए अपने परीक्षण समायोजित करें। यदि अंतर उस ईपीएसलॉन से छोटा है, तो मान बराबर माना जाता है।

2

SSE चल बिन्दु और 387 चल बिन्दु उपयोग पूरी तरह से अलग निर्देश है, और इसलिए वहाँ 387 उपयोग करने के लिए SSE fp निर्देश को समझाने के लिए कोई रास्ता नहीं है।शायद इससे निपटने का सबसे अच्छा तरीका थोड़ा अलग परिणाम प्राप्त करने के लिए अपने परीक्षण सूट से इस्तीफा दे रहा है, और परिणाम पर निर्भर नहीं है कि आखिरी बिट के समान परिणाम हैं।

5

80 बिट परिशुद्धता वास्तव में खतरनाक है। समस्या यह है कि यह वास्तव में तब तक संरक्षित है जब तक चर को CPU रजिस्टर में संग्रहीत किया जाता है। जब भी इसे रैम पर मजबूर किया जाता है, तो इसे टाइप परिशुद्धता के लिए छोटा कर दिया जाता है। इसलिए आप एक वैरिएबल वास्तव में अपने मूल्य को बदल सकते हैं भले ही कोड में कुछ भी नहीं हुआ।

3

आप long double परिशुद्धता चाहते हैं, अपने चल बिन्दु चर के सभी के लिए long double उपयोग करते हैं, बल्कि float या double उम्मीद अतिरिक्त जादू परिशुद्धता के लिए की तुलना में। यह वास्तव में एक ब्रेनर है।

+2

बिल्कुल सही। विस्तारित आंतरिक परिशुद्धता के आधार पर केवल दिल का दर्द हो सकता है। –

+0

मैं ऐसे समाधान की तलाश में था जिसके लिए बहुत अधिक कोड बदलने और स्मृति आवश्यकताओं को दोगुनी करने की आवश्यकता नहीं होगी। लेकिन, जैसा कि आप कहते हैं, यह स्पष्ट रूप से समस्या को ठीक करेगा। –

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