2013-02-28 11 views
9

x87 एफपीयू एक आंतरिक 80-बिट परिशुद्धता मोड का उपयोग करने के लिए उल्लेखनीय है, जो अक्सर कंपेलरों और मशीनों में अप्रत्याशित और अपरिवर्तनीय परिणाम की ओर जाता है। .NET पर पुनर्नवीनीकरण फ्लोटिंग-पॉइंट गणित के लिए In my search, मैंने पाया कि .NET (माइक्रोसॉफ्ट और मोनो) के दोनों बड़े कार्यान्वयन 64-बिट मोड में x87 के बजाय एसएसई निर्देशों को उत्सर्जित करते हैं।क्या एसएसई फ़्लोटिंग-पॉइंट अंकगणितीय पुनरुत्पादित है?

एसएसई (2) 32-बिट फ्लोट्स के लिए सख्ती से 32-बिट रजिस्टरों का उपयोग करता है, और 64-बिट फ्लोट के लिए सख्ती से 64-बिट रजिस्ट्रार का उपयोग करता है। appropriate control word सेट करके डेनॉर्मल्स को वैकल्पिक रूप से शून्य पर फ़्लश किया जा सकता है।

इसलिए ऐसा लगता है कि एसएसई x87 के परिशुद्धता से संबंधित मुद्दों से ग्रस्त नहीं है, और यह कि केवल परिवर्तनीय असामान्य व्यवहार है, जिसे नियंत्रित किया जा सकता है।

पारस्परिक कार्यों (जो x87 के विपरीत एसएसई द्वारा मूल रूप से प्रदान नहीं किया जाता है) के मामले को छोड़कर, मशीनों और कंपाइलरों में एसएसई गारंटी पुनरुत्पादित परिणामों का उपयोग कर रहा है? उदाहरण के लिए, संकलक अनुकूलन, विभिन्न परिणामों में अनुवाद कर सकते हैं? मुझे कुछ विवादित राय मिलीं:

यदि आपके पास एसएसई 2 है, तो इसका इस्तेमाल करें और बाद में खुशी से रहें। एसएसई 2 दोनों 32 बी और 64 बी ऑपरेशंस का समर्थन करता है और इंटरमीडिएट परिणाम ऑपरेटरों के आकार के होते हैं। - योसी Kreinin, http://www.yosefk.com/blog/consistency-how-to-defeat-the-purpose-of-ieee-floating-point.html

...

SSE2 निर्देश (...) पूरी तरह से IEEE754-1985 अनुरूप हैं, और वे बेहतर reproducibility स्थिर राउंडिंग के लिए धन्यवाद की अनुमति ( परिशुद्धता) और अन्य प्लेटफार्मों के साथ पोर्टेबिलिटी। मुलर एट aliis, Handbook of Floating-Point Arithmetic - p.107

तथापि:

इसके अलावा, आप, चल बिन्दु के लिए SSE या SSE2 उपयोग नहीं कर सकते यह भी तहत निर्दिष्ट नियतात्मक होने के लिए है, क्योंकि । - जॉन Watte http://www.gamedev.net/topic/499435-floating-point-determinism/#entry4259411

+1

मुझे पूरा यकीन है कि यदि वेब पर दो विवादित राय हैं तो आपको यहां एक तर्क मिलेगा (और शायद कम से कम एक तीसरी राय भी) – KevinDTimm

+1

@ केविन डीटीएमएम हालांकि यह प्रश्न व्यक्तिपरक नहीं है। एसएसई या तो पुनरुत्पादित है या यह नहीं है। – Asik

+1

"एसएसई या एसएसई 2 [निर्धारित] निर्धारित करने के लिए बहुत कम निर्दिष्ट है"। मैं इन मामलों पर एक विशेषज्ञ होने का दावा नहीं करता हूं, लेकिन यह मुझे बीएस की तरह लगता है। लिंक में अनुवांशिक के लिए लाइब्रेरी फ़ंक्शंस के बारे में बात है और निश्चित रूप से एक प्लेटफार्म पर उन में बग हो सकते हैं और वास्तव में कोई भी नहीं (वास्तव में, संभवतः) किसी भी कंपाइलर के अनुकूलक में हो सकता है, लेकिन यह एसएसई के बारे में कुछ नहीं कहता/एसएसई 2 प्रति से। क्या उसके पास इसका क्या अर्थ है इसका एक उदाहरण है? –

उत्तर

9

SSE पूरी तरह से निर्दिष्ट किया जाता है *। मुलर फ्लोटिंग पॉइंट अंकगणित में एक विशेषज्ञ है; आप किस पर भरोसा कर रहे हैं, उसे या कुछ आदमी gamedev मंच पर?

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

3

जैसा स्टीफन ने नोट किया, एसएसई असेंबली कोड के दिए गए टुकड़े द्वारा उत्पादित परिणाम पुन: उत्पन्न होंगे; आप एक ही कोड को एक ही इनपुट खिलाते हैं और आपको अंत में एक ही आउटपुट मिलता है। (यानी, जॉन वाटटे का उद्धरण फ्लैट-आउट गलत है।)

आपने वहां "कंपाइलर" शब्द फेंक दिया, हालांकि। यह पूरी तरह से एक अलग गेंद खेल है। फ़्लोटिंग-पॉइंट कोड की शुद्धता को संरक्षित करने के लिए कई कंपाइलर अभी भी काफी खराब हैं।(The ATLAS errata page उल्लेख करता है कि क्लैंग "कुछ परिचालनों के लिए सही कोड उत्पन्न करने में विफल रहता है।") यदि आप अपने कोड में विशेष कार्यों का उपयोग करते हैं, तो आप कुछ भी हद तक, अपनी गणित पुस्तकालय को लागू करने की दया पर भी हैं।

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