फिक्स्ड पॉइंट बनाम फ्लोटिंग पॉइंट कम्प्यूटेशन के सापेक्ष गुण?


9

मेरे पास एक डिजिटल सिग्नल प्रोसेसिंग सिस्टम है जो डबल सटीक फ़्लोटिंग पॉइंट नंबरों का उपयोग करके एक तेज़ x86 मशीन पर संचालित होता है । यह मेरे साथ हुआ है कि मैं फ्लोटिंग पॉइंट प्रतिनिधित्व की विशाल गतिशील रेंज का उपयोग नहीं कर रहा हूं - सभी मात्राएं 8 32768 की सीमा में आसानी से फिट होती हैं।

मेरा प्रश्न: क्या यह संभव है कि निश्चित बिंदु अभिकलन पर स्विच करने से संख्यात्मक सटीकता (उच्च प्राथमिकता) या अभिकलन समय (कम प्राथमिकता) में लाभ मिलेगा?

निश्चित रूप से, उत्तर इस बात पर निर्भर करता है कि एक निश्चित-बिंदु गणना के लिए कितने बिट्स उपलब्ध हैं। सटीक के कितने बिट्स विशिष्ट फिक्स्ड-पॉइंट सिस्टम का उपयोग करते हैं? क्या x86-64 पर 64-बिट्स ( 16 बिट्स पूर्णांक भाग, 48 बिट्स आंशिक भाग ) के साथ, निश्चित-बिंदु गणना को कुशलतापूर्वक करना संभव है ?

मैंने हमेशा सोचा था कि फिक्स्ड-पॉइंट गणना केवल उन स्थितियों में उपयोग की जाती है जहां सीपीयू पावर सीमित है - क्या सीपीयू पावर कोई चिंता नहीं है, क्या फिक्स्ड-पॉइंट गणना का उपयोग करना समझ में आता है?


क्या आपको वास्तव में ~ 15 महत्वपूर्ण आंकड़ों से अधिक की आवश्यकता है जो एक डबल-सटीक फ़्लोटिंग-पॉइंट वैल्यू आपको देता है? जबकि व्यापक सामान्यीकरण खराब हैं, मैं कहूंगा कि यदि आप सभी निश्चित-बिंदु डीएसपी सिस्टम के कुल को देखते हैं, तो 16-बिट पूर्णांक सबसे आम प्रारूप होने की संभावना है।
जेसन आर

जवाबों:


7

पूर्णांक की संख्यात्मक सटीकता केवल पूर्णांक की संख्यात्मक सटीकता से बेहतर होगी यदि पूर्णांक रिज़ॉल्यूशन बेहतर है। डबल्स में 52 भिन्नात्मक बिट्स होते हैं, इसलिए डबल-सटीक फ़्लोट्स में लगभग पर पूर्णांक से भी अधिक रिज़ॉल्यूशन खराब होता है , जो 32768 ( ) से बहुत बड़ा है । इसलिए, यदि आप पूर्णांक में जाते हैं, तो संख्यात्मक सटीकता बेहतर नहीं होगी।252215

दूसरा मुद्दा गति है। उत्तर है: यह हार्डवेयर पर निर्भर करता है। यदि आप एक डिजिटल सिग्नल प्रोसेसर पर अपना प्रोग्राम चला रहे हैं, जिसमें मल्टीपल फिक्स्ड पॉइंट मल्टीपल / कोर जमा है तो हाँ, यह फिक्स्ड पॉइंट में बहुत तेज़ होगा। दूसरी तरफ एक x86 चिप पर, यह वास्तव में निश्चित बिंदु में धीमा होगा। मैंने ठीक वही किया जो आप एक बार बात कर रहे हैं और मेरे निष्पादन के समय में वृद्धि देखी गई।

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

यदि आप प्रसंस्करण को गति देना चाहते हैं, तो ऐसा करने का तरीका डबल-सटीक फ़्लोट से एकल-सटीक फ़्लोट में बदलना है। कि गति में एक महत्वपूर्ण वृद्धि का उत्पादन करना चाहिए। हालांकि, यह आपके संख्यात्मक सटीकता को कम करेगा।


मेरा आशय यह था कि जब मैंने अपना लिखा तो यह उत्तर क्या कहता है। यह बेहतर है। यदि मैं गलत नहीं हूं, तो भी, मैंने कहीं पढ़ा है कि कुछ कंप्यूटरों पर (64 बिट्स?) मूल हार्डवेयर फ़्लोटिंग पॉइंट प्रकार डबल है, इसलिए एकल परिशुद्धता (चार बाइट) फ़्लोट का उपयोग करके वास्तविक धीमी हो सकती है। यह ध्यान में रखने के लिए कुछ है, वैसे भी।
हेल्टनबाइकर

एकल परिशुद्धता फ़्लोट्स में 23 बिट मंटिसे, युगल में 52 बिट्स हैं।
पॉल आर

मैं सुझाव दे रहा हूँ कि 16 बिट पूर्णांक + 48 बिट्स का अंश डबल प्रिसिजन फ़्लोटिंग पॉइंट के विकल्प के रूप में हो। मैंने यह बताने के लिए 32768 का उल्लेख किया कि मेरे मूल्य इस सीमा में आसानी से फिट होंगे। इन मूल्यों पर प्रतिबंध को देखते हुए, मुझे लगता है कि Q16.48 डबल सटीक फ़्लोटिंग पॉइंट की तुलना में अधिक संख्यात्मक सटीकता प्रदान करेगा।
nibot 20

1
@nibot ठीक है। युगल में -16 से +16 तक बेहतर परिशुद्धता होगी, और आंशिक पूर्णांकों में -32769 और +32768 तक कहीं और सटीक सटीकता होगी। वे निश्चित रूप से, इससे आगे किसी चीज का प्रतिनिधित्व नहीं कर सकते थे। वे डबल्स की तुलना में धीमे भी होंगे। मेरे लिए सीमित सीमा और धीमी गति से डील ब्रेकर होंगे, लेकिन वाईएमएमवी।
जिम क्ले

6

फिक्स्ड-पॉइंट के गुण ज्यादातर शक्ति के संदर्भ में होते हैं (जैसे कि जब आपके पास प्रोसेसर हार्डवेयर का विकल्प होता है, या प्रोसेसर अप्रयुक्त कार्यात्मक इकाइयों को बंद करने में अच्छा होता है)। ऐसा इसलिए है क्योंकि फिक्स्ड-पॉइंट इकाइयां फ्लोटिंग पॉइंट की तुलना में किसी दिए गए तकनीक और ऑपरेशन इश्यू रेट के लिए आमतौर पर छोटी (कम ट्रांजिस्टर, छोटी तारों, प्रति मैक को कम धारिता) होती हैं।

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

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


2
प्रदर्शन के संबंध में कैश मुद्दों के महत्व के उल्लेख के लिए +1। आधुनिक x86 प्रोसेसर पर, आपके एल्गोरिदम को कैश को ध्यान में रखते हुए डिजाइन करने से प्रदर्शन पर भारी प्रभाव पड़ सकता है ।
जेसन आर

5

एकल सटीक तरंगों को दोगुना करने के लिए प्राथमिकता दें - यह आपकी मेमोरी बैंडविड्थ, कैश फुटप्रिंट और स्टोरेज आवश्यकताओं को आधा कर देगा और कुछ गणितीय कार्यों को तेज कर देगा। यदि आगे अनुकूलन की आवश्यकता है, तो यह 4 तरह से SIMD की संभावना को भी खोलता है।

फिक्स्ड पॉइंट केवल तब ही सार्थक होता है जब आपके पास FPU नहीं होता है - अधिकांश आधुनिक x86 CPU में दो FPU होते हैं इसलिए निश्चित बिंदु का उपयोग करने से कुछ भी प्राप्त नहीं होता है, और निश्चित बिंदु के साथ प्रदर्शन भी काफी खराब हो सकता है। (यह भी ध्यान दें कि निश्चित बिंदु को ऑपरेशन्स जैसे गुणन के लिए फ़्लोटिंग पॉइंट की तुलना में अतिरिक्त निर्देशों की आवश्यकता होती है।)


मैं संख्यात्मक सटीकता बढ़ाने में दिलचस्पी रखता हूं , इसे कम करने में नहीं।
nibot 19

आप निश्चित बिंदु को दोहरे के सापेक्ष संख्यात्मक सटीकता में सुधार कैसे देखते हैं, जिसमें 52 बिट्स सटीक और पहले से ही एक विशाल गतिशील रेंज है?
पॉल आर

खैर, मैं 52 से अधिक बिट्स के साथ एक निश्चित-बिंदु प्रारूप का उपयोग कर सकता था।
nibot

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

3

यहां दिए गए बहुत अच्छे उत्तरों के अलावा, कुछ चीजें जोड़ने लायक हैं:

  • ऐसी स्थितियां हैं, भले ही आपके द्वारा संसाधित की जाने वाली डेटा की गतिशील सीमा पर आपकी बहुत बुनियादी आवश्यकताएं हों, फिर भी आपको उस पर किए गए कुछ कार्यों के लिए एक बहुत अच्छी परिशुद्धता की आवश्यकता होगी - उदाहरण के लिए आप एक IIR फ़िल्टर लागू करना चाहेंगे अपेक्षाकृत छोटे गुणांक की आवश्यकता होती है; और उन्हें छोटा करने से अस्थिरता पैदा होगी। जैसे ही आपके सिस्टम का फीडबैक होता है, एक अच्छा मौका होता है कि क्वांटाइज़ेशन / ट्रंकेशन प्रॉब्लम आपको निश्चित बिंदु का उपयोग करते समय वापस काट देगा - आपको फ़िल्टर टोपोलॉजी और ट्रंकेशन / अंश-बचत योजनाओं जैसी चीजों के बारे में अधिक सावधान रहना होगा।
  • कई डीएसपी / डीएससी आर्किटेक्चर के विपरीत, x86 में पूर्णांक संचालन नहीं है (खैर, यह एसएसई में है, मानक स्केलर कोड पर नहीं)। इसका मतलब यह है कि अतिप्रवाह के मामले में, खराब चीजें हो सकती हैं - मान बदलते संकेत और "लपेटना"। आपको ओवरफ्लो और डायनामिक रेंज के साथ अतिरिक्त सतर्क रहना होगा, या ऑपरेंड रेंज पर परीक्षण छिड़कना होगाआपके कोड पर सभी। इससे प्रदर्शन को गंभीर चोट पहुंच सकती है। तुलनात्मक रूप से, फ्लोटिंग पॉइंट इन समस्याओं के लिए अधिक लचीला है, क्योंकि बड़ी गतिशील सीमा आपको अधिक "हेडरूम" देती है, और ओवरफ्लो के कारण भयावह विफलता नहीं होगी। डेस्कटॉप कंप्यूटर पर चलने वाले अधिकांश ऑडियो सिग्नल प्रोसेसिंग कोड -1.0 .. 1.0 रेंज, सिंगल या डबल परिशुद्धता का उपयोग कर रहे हैं; इसलिए यह हेडरूम के सैकड़ों से अधिक डीबी देता है। मैंने दोनों दृष्टिकोणों के साथ ऑडियो सिग्नल प्रोसेसिंग कोड लिखा है, और फ़्लोटिंग पॉइंट का उपयोग करते समय केवल कुछ स्थान हैं जब मुझे सिग्नल को स्पष्ट रूप से क्लिप / संतृप्त करना होता है - आमतौर पर सिग्नल प्रोसेसिंग चेन के अंत में या उन स्थानों पर जहां प्रतिक्रिया होती है।

1

विचार करने के लिए कुछ बिंदु:

  • अधिकांश आधुनिक प्रोसेसर कई वर्षों से फ्लोटिंग-पॉइंट नंबरक्रंचिंग का अनुकूलन कर रहे हैं, और यहां तक ​​कि GPU का उपयोग पहले से ही, बहुत सफलतापूर्वक किया जा रहा है;
  • निश्चित-बिंदु गणना आपके डेटा को नुकसान पहुंचाती है और गंभीर समस्याएं पैदा कर सकती है जब अंकगणितीय संचालन अच्छी तरह से वातानुकूलित नहीं होते हैं (यही कारण है कि फिक्स्ड-पॉइंट नंबर फ्लोटिंग पॉइंट वाले द्वारा प्रतिस्थापित किए गए थे);
  • यहां तक ​​कि अगर आप अपने डेटा पर हस्ताक्षर किए गए शॉर्ट्स का उपयोग करते हैं, तो आपके डेटा (बहुत से ड्राफ्टस्टर्स 16 बिट परिशुद्धता का उपयोग करते हैं), CALCULATIONS को फ़्लोटिंग पॉइंट में किया जाना चाहिए, फिर पूर्णांक में बदल दिया जाना चाहिए, अन्यथा मात्रात्मकता और अलियासिंग जैसी कलाकृतियां हो सकती हैं।

अंतिम शब्द के रूप में, मुझे लगता है कि हमारा रियलवर्ल्ड डेटा कीमती है और कंप्यूटर का अंधा नंबर एक विनम्र काम है। आपके डेटा और आपके लिए भारी-भरकम काम करने के लिए कंप्यूटर को रखा जाना चाहिए, और ऐसा नहीं माना जाना चाहिए जैसे कि यह शो में असली स्टार था।


मेरा मतलब यह नहीं था कि मैं अपनी मात्राओं को शामिल करने के लिए 16-बिट शॉर्ट्स का उपयोग करूंगा, बल्कि 16-बिट पूर्णांक वाले भाग और 48-बिट अंश वाले भाग के साथ 64-बिट फिक्स्ड पॉइंट प्रारूप जैसा कुछ होगा। प्रेरणा यह है कि, यदि मैं फ़्लोटिंग पॉइंट प्रारूप में वैसे भी अधिकांश घातांक बिट्स का उपयोग नहीं कर रहा हूं, तो क्या मैं अपनी बिटकॉइन की सटीकता में सुधार करूंगा अगर मैं इसके बजाय उन बिट्स का उपयोग अतिरिक्त महत्वपूर्ण अंक प्रदान करने के लिए करूं?
निबोट

आपको अपने 16-बिट पूर्णांक + 48-बिट अंश को मूल प्रश्न में जोड़ना चाहिए। ऐसा लग रहा है215भ्रम पैदा कर रहा है।
क्रिस्टोफर फेल्टन

एक और बात: मुझे लगता है कि StackOverflow (बजाय DSP.SE, यहाँ) पेशेवरों और दूसरे पर एक प्रारूप के विपक्ष के बारे में गहरे कारणों को प्राप्त करने के लिए आदर्श स्थान होगा।
हेल्टनबाइकर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.