ফ্লোট বনাম ডাবল পারফরম্যান্স


92

আমি কিছু সময়জ্ঞান পরীক্ষা করেনি এবং মত কিছু নিবন্ধগুলি পড়ুন এই এক (শেষ মন্তব্য), এবং আপনি এটা পছন্দ রিলিজ বিল্ড ভাসা এবং ডাবল মান প্রক্রিয়াকরণের সময় একই পরিমাণ নিতে দেখায়।

এটা কিভাবে সম্ভব? যখন ডাবল মানগুলির তুলনায় ভাসা কম সুনির্দিষ্ট এবং ছোট হয়, তখন কীভাবে সিএলআর একই প্রক্রিয়াজাতকরণের সময় ডাবল পেতে পারে?


10
আমি মনে করি না যে এটির যথাযথ নকল কারণ এটির পিছনের কারণটি যেখানে অন্য ব্যবহারকারী হিসাবে জিজ্ঞাসা করা হচ্ছে এটি আসলেই দ্রুত কিনা তবে অগত্যা কেন তা নয়
জোয়ান ভেনজে

মনে করা যায় যে সি # এর ফ্লোটের চেয়ে দ্বিগুণ দ্রুত কি ডুপ্লিকেট রয়েছে ? (অন্য ব্যবহারকারী দ্বারা 2009 সালে দাবি করা)
পিটার মর্টেনসেন

উত্তর:


156

কমপক্ষে x86 প্রসেসরে floatএবং doubleপ্রতিটি প্রসেসিংয়ের জন্য এফপিইউ দ্বারা 10-বাইট রিয়েল রূপান্তরিত হবে। এফপিইউর বিভিন্ন ফ্লোটিং-পয়েন্ট ধরণের সমর্থনের জন্য পৃথক প্রসেসিং ইউনিট নেই।

১০০ বছর আগে বেশিরভাগ সিপিইউতে অন্তর্নির্মিত এফপিইউ ছিল না (এবং কয়েকটি লোকের জন্য পৃথক এফপিইউ চিপস ছিল না) তার floatচেয়ে পুরানো পরামর্শটি দ্রুত doubleপ্রয়োগ করা হয়েছে, সুতরাং বেশিরভাগ ভাসমান-পয়েন্ট ম্যানিপুলেশন সফ্টওয়্যারটিতে করা হয়েছিল। এই মেশিনগুলিতে (যা লাভা পিট দ্বারা উত্পাদিত বাষ্প দ্বারা চালিত ছিল), এটি ব্যবহার করা আরও দ্রুত ছিলfloat । এখন আসলের একমাত্র আসল সুবিধা floatহ'ল তারা কম জায়গা গ্রহণ করে (যা কেবল যদি আপনার লক্ষ লক্ষ লোক থাকে তবে তা গুরুত্বপূর্ণ)।


9
সম্ভবত 100 বছর আগে নয় ... কিছু এফপিইউ ফ্ল্যাট, ডাবল এবং 80-বিট স্তরে নেটিভ হ্যান্ডলিংকে সমর্থন করে এবং আরও কম দৈর্ঘ্যে কার্যকর করা হবে। কিছু আসলে খুব কম দৈর্ঘ্যে ধীরে ধীরে কিছু জিনিস
চালিত

4
সম্ভাব্য ব্যতিক্রম: আমি মনে করি বিভাগগুলির জন্য সময় বিটের সংখ্যার উপর নির্ভরশীল (1 ঘড়ি চক্র / 2 বিট)। আমি ভাসা বনাম দ্বিগুণ বিভাগ তৈরির সময়গুলির সাথে এটি মিলবে বলে মনে হচ্ছে।
নীল কফফি

22
সিমডি কোডের জন্য সাবধান - যেহেতু আপনি সিমড রেজিস্টারে দ্বিগুণের চেয়ে 2 এক্স ফ্লোট প্যাক করতে পারেন (যেমন এসএসই), সম্ভবত ফ্লোটে অপারেটিং আরও দ্রুততর হতে পারে। তবে এটি যেহেতু এটি সি #, সম্ভবত এটি ঘটবে না।
কলিথ

14
@ পি বাবা: আমি বলব ক্যাশে হাইরাচির প্রতিটি স্তরে স্থান সুবিধাটি গুরুত্বপূর্ণ। যখন আপনার প্রথম স্তরের ডেটা ক্যাশেটি 16KB বড় হয় এবং আপনি 4000 সংখ্যার অ্যারে ক্রাঞ্চ করছেন, তত সহজেই দ্রুততর হতে পারে।
পিটার জি।

4
@ আর্টিফিশিয়ডিওটি কখনও কখনও বলবেন না;)।
সিমডটি

14

এটি 32-বিট বা 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);
    }

4
আপনি কি বিবেচনা করেছেন যে 30% আপনার অতিরিক্ত ক্যাস্ট ব্যবহার করার কারণে হতে পারে ??
রাসমাস দামগার্ড নীলসন

@ রসমাসডামগার্ড নিলসন যেহেতু Mathডাবল নিয়ে কাজ করে তাই ক্যাসেটগুলি সমস্যার অংশ । তবে আপনি আমার পোস্টটি ভুলভাবে লিখেছেন: আমার পরীক্ষাগুলি আমাকে পারফরম্যান্সে আরও ভালভাবে ভাসিয়েছিল।
বিটারব্লিউ

4
উপরে পোস্ট ফলাফল বোগাস হয়। আমার পরীক্ষাগুলি দেখায় যে রিলিজ মোডে .NET 4.0 সহ পুরানো 32-বিট মেশিনে, floatএবং doubleকার্য সম্পাদন কার্যত অভিন্ন। অনেকগুলি স্বতন্ত্র পরীক্ষার গড় গড় যখন 0.3% এর চেয়ে কম হয় তবে প্রতিটি পরীক্ষায় ক্রমাগত শৃঙ্খলাবদ্ধ ভেরিয়েবলগুলি (যে কোনও সংকলক অপ্টিমাইজেশন পেতে না পারে) এর জন্য বহুগুণ, বিভাজন এবং সংযোজন করা হয়। আমি পরীক্ষার একটি দ্বিতীয় সেট চেষ্টা Math.Sin()এবং Math.Sqrt()এবং অভিন্ন ফলাফল পেয়েছি।
বিশেষ সস

13

আমার একটি ছোট প্রকল্প ছিল যেখানে আমি চুদা ব্যবহার করেছি এবং আমি মনে করতে পারি যে ভাসাটি সেখানে দ্বিগুণের চেয়েও দ্রুত ছিল। হোস্ট এবং ডিভাইসের মধ্যে ট্র্যাফিক একবারের জন্য কম হলে (হোস্টটি সিপিইউ এবং "সাধারণ" র‌্যাম এবং ডিভাইসটি জিপিইউ এবং সেখানে সম্পর্কিত র‌্যাম হয়)। এমনকি যদি ডেটা ডিভাইসে সর্বদা এটি ধীর হয়। আমি মনে করি আমি কোথাও পড়েছি যে এটি সম্প্রতি পরিবর্তিত হয়েছে বা পরবর্তী প্রজন্মের সাথে পরিবর্তিত হওয়ার কথা, তবে আমি নিশ্চিত নই।

সুতরাং দেখে মনে হচ্ছে যে জিপিইউ কেবলমাত্র সেই ক্ষেত্রে ডাবল স্পষ্টতা হ্যান্ডেল করতে পারে না, এটিও ব্যাখ্যা করবে যে কেন জিএলফ্লোট সাধারণত জিএলডুবলের চেয়ে বেশি ব্যবহৃত হয়।

(যেমনটি আমি বলেছি এটি যতদূর আমি মনে করতে পারি, একটি সিপিইউতে ভাসমান বনাম ডাবল সন্ধানের সময় এটি কেবল হোঁচট খেয়েছে)


7
জিপিইউগুলি এফপিইউগুলির তুলনায় সম্পূর্ণ ভিন্ন প্রাণী। অন্যরা যেমন এফপিইউর স্থানীয় ফর্ম্যাটটি উল্লেখ করেছেন সেটি হ'ল 80 বিট ডাবল নির্ভুলতা। এবং এটি এখন অনেক দিন ধরে। জিপিইউগুলি তবে একক নির্ভুলতা থেকে এই ক্ষেত্রটির কাছে যান। এটি সুপরিচিত যে তাদের ডিপি এফপি (ডাবল নির্ভুলতা ভাসমান পয়েন্ট) পারফরম্যান্স প্রায়শই এসপি এফপি সম্পাদনের ঠিক অর্ধেক হয়ে থাকে। দেখে মনে হচ্ছে তাদের প্রায়শই এসপি ভাসমান পয়েন্ট ইউনিট থাকে এবং ডাবল স্পষ্টতা কভার করতে তাদের ইউনিটটি পুনরায় ব্যবহার করতে হয়। যা একের তুলনায় ঠিক দুটি চক্রের ফলন দেয়। এটি একটি দুর্দান্ত পারফরম্যান্সের পার্থক্য , যা যখন আমি এর মুখোমুখি হয়েছিলাম তখন আমাকে স্তম্ভিত করেছিল।
সিএসবা তোথ

4
কিছু বৈজ্ঞানিক গণনার জন্য ডিপি এফপি প্রয়োজন, এবং সীসা জিপিইউ নির্মাতারা পার্শ্ববর্তী পারফরম্যান্স পেনাল্টির বিজ্ঞাপন করেনি। এখন তারা (এএমডি, এনভিডিয়া) ডিপি বনাম এসপি বিষয়টিতে কিছুটা উন্নতি করেছে বলে মনে হচ্ছে। ইন্টেল শিওন ফি'র অনেকগুলি কোরতে পেন্টিয়ামের এফপিইউ রয়েছে এবং লক্ষ্য করুন যে ইন্টেল তার দ্বিগুণ নির্ভুলতার ক্ষমতাগুলিকে জোর দিয়েছিল । এটি সম্ভবত এটি জিপিজিইউ দানবগুলির সাথে সত্যিই প্রতিযোগিতা করতে সক্ষম।
সিএসবা তোথ

12

এখনও কিছু ক্ষেত্রে রয়েছে যেখানে ভাসমানগুলি অগ্রাধিকার দেওয়া হয় - যেমন ওপেনজিএল কোডিংয়ের সাথে জিএলডুবলের চেয়ে বেশিরভাগ জিপিইউতে আরও দক্ষ হওয়ায় এটি GLFloat ডেটাটাইপ (সাধারণত 16 বিট ফ্লোটে সরাসরি ম্যাপ করা হয়) ব্যবহার করা বেশি সাধারণ।


4
বেশি ডেটা থ্রুটপুটের কারণে হতে পারে? আপনার যদি সংখ্যার ম্যাট্রিক্স থাকে (জেড-বাফার ইত্যাদি), তবে ডেটা আকার আরও গুরুত্বপূর্ণ হয়ে ওঠে এবং ভাসমান এবং ডাবল গতির হাতলয়ের মধ্যে রূপান্তর এড়ানো। আমার ধারণা.
Lucero

4
নিঃসন্দেহে থ্রুপুট। বিশেষায়িত প্রসঙ্গটি দেওয়া হলেও ভাসমানের ওপরে ডাবল ব্যবহার করে প্রাপ্ত কোনও দৃশ্যমান কিছুই নেই তাই কেন স্মৃতিটি নষ্ট করবেন - বিশেষত এটি সিপিইউগুলির তুলনায় জিপিইউগুলিতে কম সরবরাহে রয়েছে
ক্রুয়াচান

4
থ্রুপুট এবং এও সত্য যে এসপি এফপি (একক নির্ভুলতা ভাসমান পয়েন্ট) ডিপি এফপি (ডাবল স্পেসিফিকেশন) এর চেয়ে জিপিইউ অভ্যন্তরীণ এফপিইউগুলির মূল ফর্ম্যাট। @ মেনির উত্তরে আমার মন্তব্য দেখুন। জিপিইউ এবং সিপিইউ এফপিইউগুলি একেবারেই আলাদা প্রাণী, সিপিইজের এফপিইউ ডিপি এফপিতে ভাবছে।
সিএসবা তোথ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.