2013-10-27 30 views
13

सी/सी ++ में किसी विशेष एल्गोरिदम को लागू करने के लिए हमें आवश्यक वैज्ञानिक कंप्यूटिंग समस्याओं का बहुमत सटीकता की मांग करता है जो डबल परिशुद्धता से बहुत कम है। उदाहरण के लिए, 1e-6, 1e-7 सटीकता ODE सॉल्वर या संख्यात्मक एकीकरण के मामलों में 99% शामिल है। यहां तक ​​कि दुर्लभ मामलों में जब हमें उच्च सटीकता की आवश्यकता होती है, आमतौर पर संख्यात्मक विधि स्वयं विफल होने से पहले विफल होती है जो कि हम दोहरी परिशुद्धता के निकट सटीकता तक पहुंचने का सपना देख सकते हैं। उदाहरण: राउंडऑफ त्रुटियों के कारण मानक नॉस्टिफ सामान्य अंतर समीकरण को हल करते समय भी हम एक सरल रेज-कुट्टा विधि से 1e-16 सटीकता की अपेक्षा नहीं कर सकते हैं। इस मामले में, डबल परिशुद्धता आवश्यकता गलत जवाब के बेहतर अनुमान लगाने के लिए पूछने के समान है।फ़्लोटिंग-पॉइंट ऑप्टिमाइज़ेशन - दिशानिर्देश

फिर, आक्रामक फ्लोट प्वाइंट ऑप्टिमाइज़ेशन ज्यादातर मामलों में जीत-जीत की स्थिति प्रतीत होता है क्योंकि यह आपके कोड को तेज़ बनाता है (बहुत तेज!) और इससे आपकी विशेष समस्या की लक्ष्य सटीकता प्रभावित नहीं होती है। उस ने कहा, यह सुनिश्चित करना मुश्किल है कि एफपी अनुकूलन के खिलाफ एक विशेष कार्यान्वयन/कोड स्थिर है। शास्त्रीय (और कुछ हद तक परेशान) उदाहरण: जीएसयू वैज्ञानिक पुस्तकालय जीएसएल न केवल बाजार में मानक संख्यात्मक पुस्तकालय है बल्कि यह एक बहुत अच्छी तरह लिखित पुस्तकालय है (मैं खुद को बेहतर काम करने की कल्पना नहीं कर सकता)। हालांकि, जीएसएल एफपी अनुकूलन के खिलाफ स्थिर नहीं है। वास्तव में, यदि आप इंटेल कंपाइलर के साथ जीएसएल संकलित करते हैं, उदाहरण के लिए, तो इसके आंतरिक परीक्षण तब तक असफल हो जाएंगे जब तक आप -fp-model strict ध्वज चालू नहीं करते हैं जो fp अनुकूलन को बंद करता है।

इस प्रकार, मेरा प्रश्न है: क्या कोड लिखने के लिए सामान्य दिशानिर्देश हैं जो आक्रामक फ़्लोटिंग पॉइंट अनुकूलन के खिलाफ स्थिर हैं। क्या ये दिशा-निर्देश भाषा (कंपाइलर) विशिष्ट हैं। यदि हां, तो सी/सी ++ (जीसीसी/आईसीसी) सर्वोत्तम प्रथाएं क्या हैं?

नोट 1: यह प्रश्न यह नहीं पूछ रहा है कि जीसीसी/आईसीसी में एफपी अनुकूलन झंडे क्या हैं।

नोट 2: यह प्रश्न सी/सी ++ अनुकूलन के लिए सामान्य दिशानिर्देशों के बारे में नहीं पूछ रहा है (जैसे छोटे कार्यों के लिए वर्चुअल फ़ंक्शंस का उपयोग न करें)।

नोट 3: यह प्रश्न अधिकांश मानक एफपी अनुकूलन (जैसे x/x -> 1) की सूची नहीं पूछ रहा है।

नोट 4: मुझे दृढ़ विश्वास है कि यह शास्त्रीय "सबसे अच्छे सर्वर नाम" के समान व्यक्तिपरक/ऑफ-विषय प्रश्न नहीं है। यदि आप असहमत हैं (क्योंकि मैं एक ठोस उदाहरण/कोड/समस्या प्रदान नहीं कर रहा हूं), तो इसे समुदाय विकी के रूप में चिह्नित करें। मुझे कुछ स्थिति बिंदु प्राप्त करने के उत्तर में उत्तर में बहुत दिलचस्पी है (नहीं, वे महत्वपूर्ण नहीं हैं - आपको बिंदु मिल गया है!)।

+2

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

+2

सामान्य संख्यात्मक स्थिरता अक्सर ध्यान से चुने गए और अधिकतर नाजुक मध्यवर्ती चरणों के माध्यम से प्राप्त की जाती है, विशेष रूप से परिमित-परिशुद्धता फ्लोटिंग-पॉइंट अंकगणितीय के गैर-सहयोगी चरित्र को दूर करने के लिए डिज़ाइन की गई है। आक्रामक अनुकूलन इसे तोड़ने के लिए प्रवृत्त होते हैं निष्पादन के आदेश को बदलकर। इटरेटिव एडजस्टमेंट मदद कर सकता है, लेकिन फिर जवाब पाने में अधिक समय लगता है। प्रो टिप: आप अपने प्रश्न [कम्प्यूटेशनल साइंस] (http://scicomp.stackexchange.com/) साइट पर पोस्ट करना चाहते हैं। –

उत्तर

12

कंपाइलर निर्माता -ffast-math इस तरह के अनुकूलन को औचित्य देते हैं कि numerically stable algorithms पर इन अनुकूलन का प्रभाव न्यूनतम है।

इसलिए, यदि आप इन अनुकूलन के खिलाफ मजबूत कोड लिखना चाहते हैं, तो पर्याप्त स्थिति केवल संख्यात्मक स्थिर कोड लिखना है।

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

नोट 1: संख्यात्मक स्थिरता की वांछनीयता संकलक अनुकूलन से परे है। यदि आपके पास विकल्प है, तो -ffast-math -स्टाइल अनुकूलन का उपयोग करने की योजना नहीं है, भले ही संख्यात्मक रूप से स्थिर कोड लिखें। कड़ाई से आईईईई 754 फ्लोटिंग-पॉइंट सेमेन्टिक्स के साथ संकलित होने पर भी संख्यात्मक रूप से अस्थिर कोड गलत परिणाम प्रदान कर सकता है।

नोट 2: आप जब -ffast-math शैली झंडे के साथ संकलित बाहरी पुस्तकालयों काम करने की उम्मीद नहीं कर सकते। फ्लोटिंग पॉइंट विशेषज्ञों द्वारा लिखे गए इन पुस्तकालयों को आईईईई 754 कम्प्यूटेशंस के गुणों के साथ सूक्ष्म चाल चलाना पड़ सकता है। इस तरह की चाल -ffast-math ऑप्टिमाइज़ेशन द्वारा तोड़ दी जा सकती है, लेकिन यदि आप इसे देने देते हैं तो भी आप संकलक से अपेक्षा कर सकते हैं। फ़्लोटिंग-पॉइंट कंप्यूटेशंस के लिए, डोमेन ज्ञान के साथ विशेषज्ञ हर बार कंपाइलर धड़कता है। उदाहरण के लिए CRlibm में पाया गया ट्रिपल-डबल कार्यान्वयन है। यह कोड तोड़ता है अगर यह सख्त आईईईई 754 अर्थशास्त्र के साथ संकलित नहीं है। एक अन्य, अधिक प्राथमिक एल्गोरिथ्म कि संकलक अनुकूलन तोड़ने Kahan summation है: जब असुरक्षित अनुकूलन के साथ संकलित, c = (t - sum) - yc = 0 लिए अनुकूलित है। यह, ज़ाहिर है, पूरी तरह से एल्गोरिदम के उद्देश्य को हरा देता है।

+1

पुस्तकालय के लिए "-फैस्ट-गणित" के साथ काम करना असंभव नहीं है। जीएसएल डेवलपर्स के मील का पत्थर लक्ष्य जीएसएल स्थिर-गणित के तहत स्थिर करना है (जीएसएल मेल सूची पर एक रिपोर्ट के अनुसार)। वे कहते हैं कि यह कठिन होगा (लेकिन असंभव नहीं)। इसके अलावा, जीएसएल केवल बहुत विश्वसनीय और स्थिर एल्गोरिदम लागू करता है। तो यह एक कोड मुद्दा है जो हल करना असंभव नहीं है => इसे प्राप्त करने के लिए सी/सी ++ में सामान्य तकनीकें होनी चाहिए। –

+2

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

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