फ्लोट बनाम डबल प्रदर्शन


91

मैंने कुछ समय परीक्षण किए और कुछ लेख भी पढ़े जैसे कि यह एक (अंतिम टिप्पणी), और यह रिलीज बिल्ड, फ्लोट और दोहरे मानों में लगता है, जो प्रसंस्करण समय की एक ही राशि लेते हैं।

यह कैसे हो सकता है? जब फ्लोट डबल मानों की तुलना में कम सटीक और छोटा होता है, तो सीएलआर एक ही प्रसंस्करण समय में डबल्स कैसे प्राप्त कर सकता है?


10
मुझे नहीं लगता कि यह एक सटीक डुप्लिकेट है क्योंकि यह इसके पीछे का कारण पूछ रहा है, जैसा कि अन्य उपयोगकर्ता पूछ रहा है कि क्या यह वास्तव में तेज़ है, लेकिन जरूरी नहीं कि क्यों,
Joan Venge

माना जाता है कि C # में तैरने की तुलना में क्या डुप्लिकेट का एक सटीक डुप्लिकेट तेज़ है? (एक अन्य उपयोगकर्ता द्वारा 2009 में दावा किया गया)।
पीटर मॉर्टेंसन

जवाबों:


153

X86 प्रोसेसर पर, कम से कम, floatऔर doubleप्रत्येक को प्रसंस्करण के लिए FPU द्वारा वास्तविक 10-बाइट में परिवर्तित किया जाएगा। FPU के पास अलग-अलग फ़्लोटिंग-पॉइंट प्रकारों के लिए अलग-अलग प्रसंस्करण इकाइयाँ नहीं हैं जो इसका समर्थन करता है।

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


9
शायद 100 साल पहले नहीं ... कुछ एफपीयू फ्लोट, डबल और 80-बिट स्तरों पर देशी हैंडलिंग का समर्थन करते हैं और कम लंबाई में तेजी से निष्पादित करेंगे। कुछ वास्तव में धीमी लंबाई में भी कुछ चीजें धीमी गति से निष्पादित करेंगे ... :-)
ब्रायन नोब्लुक

4
संभावित अपवाद: मुझे लगता है कि विभाजन का समय बिट्स की संख्या (1 घड़ी चक्र / 2 बिट्स) पर निर्भर है। टाइमिंग्स मैं डबल फ्लोट बनाम फ्लोट से बना है, इसके साथ तालमेल लगता है।
नील कॉफ़ी

21
SIMD कोड के लिए कैविएट - जब से आप 2x फ्लोट्स को एक SIMD रजिस्टर (जैसे SSE) में डबल्स से पैक कर सकते हैं, संभवतः फ्लोट्स पर काम करना तेज हो सकता है। लेकिन चूंकि यह C # है, इसलिए ऐसा होने की संभावना नहीं है।
18

13
@ पी डैडी: मैं कहूंगा कि कैश हिरेची के हर स्तर पर अंतरिक्ष लाभ मायने रखता है। जब आपका पहला स्तर डेटा कैश 16KB बड़ा होता है और आप 4000 की संख्या में क्रंच कर रहे होते हैं, तो फ्लोट आसानी से तेज हो सकता है।
पीटर जी।

4
@ आर्टिफिशियडॉट नेवर ने कभी नहीं कहा;)। SIMD को 4.6 के बाद से .NET में समर्थित है
9

13

मेरे पास एक छोटा प्रोजेक्ट था जहां मैंने CUDA का इस्तेमाल किया था और मुझे याद है कि फ्लोट वहां डबल से भी तेज था, भी। एक बार होस्ट और डिवाइस के बीच का ट्रैफ़िक कम होने के बाद (होस्ट सीपीयू है और "सामान्य" रैम और डिवाइस जीपीयू है और वहां संबंधित रैम है)। लेकिन भले ही डेटा डिवाइस पर हर समय धीमा रहता है। मुझे लगता है कि मैंने कहीं पढ़ा है कि यह हाल ही में बदल गया है या अगली पीढ़ी के साथ बदलने वाला है, लेकिन मुझे यकीन नहीं है।

तो ऐसा लगता है कि GPU बस उन मामलों में मूल रूप से दोहरे परिशुद्धता को नहीं संभाल सकता है, जो यह भी बताएगा कि GLFloat का उपयोग आमतौर पर GLDouble के बजाय क्यों किया जाता है।

(जैसा कि मैंने कहा कि यह केवल जहाँ तक मुझे याद है, बस एक सीपीयू पर फ्लोट बनाम डबल की खोज करते समय इस पर ठोकर खाई।)


5
जीपीयू एफपीयू की तुलना में पूरी तरह से अलग जानवर हैं। जैसा कि दूसरों ने उल्लेख किया है कि एफपीयू का मूल प्रारूप 80 बिट डबल परिशुद्धता है। और वह लंबे समय से है। जीपीयू हालांकि एकल परिशुद्धता से इस क्षेत्र में आता है। यह अच्छी तरह से ज्ञात है कि उनका डीपी एफपी (डबल सटीक फ्लोटिंग पॉइंट) प्रदर्शन अक्सर एसपी एफपी प्रदर्शन का आधा होता है। ऐसा लगता है कि उनके पास अक्सर एसपी फ़्लोटिंग पॉइंट इकाइयाँ होती हैं, और उन्हें दोहरी परिशुद्धता को कवर करने के लिए यूनिट का पुन: उपयोग करना पड़ता है। जो एक की तुलना में ठीक दो चक्र पैदा करता है। यह एक बहुत बड़ा प्रदर्शन अंतर है , जिसने मुझे सामना किया, जब मैंने इसका सामना किया।
सेबा ताथ

1
कुछ वैज्ञानिक संगणनाओं के लिए डीपी एफपी की आवश्यकता होती है, और सीसा जीपीयू निर्माताओं ने उसके आसपास के प्रदर्शन के दंड का विज्ञापन नहीं किया है। अब वे (एएमडी, एनवीडिया) उस डीपी बनाम एसपी विषय पर कुछ हद तक सुधार करते हैं। Intel Xeon Phi के कई कोर में Pentium का FPUs है, और ध्यान दें कि Intel ने इस पर जोर दिया है कि यह दोहरी परिशुद्धता क्षमताएं हैं। यही कारण है कि यह शायद GPGPU राक्षसों के साथ प्रतिस्पर्धा करने में सक्षम है।
Csaba टोथ

12

हालांकि अभी भी कुछ मामले हैं जहां फ्लोट्स को पसंद किया जाता है - उदाहरण के लिए ओपनजीएल कोडिंग के साथ GLFloat डेटाटाइप (आमतौर पर सीधे 16 बिट फ्लोट पर मैप किया गया) का उपयोग करना कहीं अधिक सामान्य है क्योंकि यह GLDouble की तुलना में अधिकांश GPU पर अधिक कुशल है।


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

2
निस्संदेह थ्रूपुट। विशेष संदर्भ दिए जाने पर, झांकियों पर युगल का उपयोग करने से प्राप्त होने की संभावना नहीं है, इसलिए मेमोरी को क्यों बर्बाद करें - विशेष रूप से यह सीपीयू की तुलना में GPU पर कम आपूर्ति में है
क्रूचन

1
थ्रूपुट और इस तथ्य से भी कि एसपी एफपी (एकल सटीक फ्लोटिंग पॉइंट) डीपी एफपी (डबल सटीक) की तुलना में जीपीयू आंतरिक एफपीयू का मूल प्रारूप अधिक है। @ मेने के जवाब के लिए मेरी टिप्पणी देखें। GPU और CPU FPUs बहुत अलग जानवर हैं, CPU का FPU DP FP में सोच रहा है।
सेबा ताथ


12

यह 32-बिट या 64-बिट सिस्टम पर निर्भर करता है। यदि आप 64-बिट के लिए संकलन करते हैं, तो डबल तेजी से होगा। 64-बिट (मशीन और ओएस) पर 32-बिट के लिए संकलित किया गया, जो लगभग 30% तेज़ी से तैरता है:

    public static void doubleTest(int loop)
    {
        Console.Write("double: ");
        for (int i = 0; i < loop; i++)
        {
            double a = 1000, b = 45, c = 12000, d = 2, e = 7, f = 1024;
            a = Math.Sin(a);
            b = Math.Asin(b);
            c = Math.Sqrt(c);
            d = d + d - d + d;
            e = e * e + e * e;
            f = f / f / f / f / f;
        }
    }

    public static void floatTest(int loop)
    {
        Console.Write("float: ");
        for (int i = 0; i < loop; i++)
        {
            float a = 1000, b = 45, c = 12000, d = 2, e = 7, f = 1024;
            a = (float) Math.Sin(a);
            b = (float) Math.Asin(b);
            c = (float) Math.Sqrt(c);
            d = d + d - d + d;
            e = e * e + e * e;
            f = f / f / f / f / f;
        }
    }

    static void Main(string[] args)
    {
        DateTime time = DateTime.Now;
        doubleTest(5 * 1000000);
        Console.WriteLine("milliseconds: " + (DateTime.Now - time).TotalMilliseconds);

        time = DateTime.Now;
        floatTest(5 * 1000000);
        Console.WriteLine("milliseconds: " + (DateTime.Now - time).TotalMilliseconds);

        Thread.Sleep(5000);
    }

2
क्या आपने माना है कि उन 30% अतिरिक्त जातियों के कारण हो सकते हैं जिनका आप उपयोग करते हैं ??
रासमस डमगार्ड नीलसन

@RasmusDamgaardNielsen Mathडबल के साथ काम करने के बाद से यह समस्या का एक हिस्सा है । लेकिन आपने मेरी पोस्ट को गलत बताया: मेरे परीक्षणों ने मुझे प्रदर्शन में बेहतर दिखाया।
बिटरब्लू

2
ऊपर पोस्ट किए गए परिणाम फर्जी हैं। मेरे परीक्षण बताते हैं कि रिलीज़ मोड में .NET 4.0 के साथ 32-बिट मशीन पर, floatऔर doubleप्रदर्शन लगभग समान हैं। कई स्वतंत्र परीक्षणों पर औसतन 0.3% से कम अंतर है, जहां प्रत्येक परीक्षण ने लगातार जंजीरों वाले चर पर गुणा, विभाजन और इसके अलावा ऑप्स का प्रयोग किया (किसी भी संकलक अनुकूलन से बचने के लिए)। मैं के साथ परीक्षण के एक दूसरे सेट करने की कोशिश की Math.Sin()और Math.Sqrt()और भी समान परिणाम मिला है।
स्पेशल सॉस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.