CPU बनाम GPU पर ज्यामितीय रूपांतरण


9

मैंने देखा है कि कई 3D प्रोग्राम आम तौर पर वेक्टर / मैट्रिक्स गणना और साथ ही सीपीयू पर ज्यामितीय परिवर्तन करते हैं। क्या किसी ने इन गणनाओं को GPU पर शीर्ष शेड में ले जाने में एक फायदा पाया है?

जवाबों:


3

आम तौर पर बोल: GPU पर मेष परिवर्तन किया जाता है। आप परिवर्तन मैट्रिक्स को GPU में भेजते हैं और shader इसे मेष की सभी लंबाइयों पर लागू करता है।

मैट्रिक्स की गणना करने के लिए GPU का उपयोग करना अपने आप में एक अलग मामला है और वास्तव में GPU पर धीमा है क्योंकि बहुत सारे संग्रहीत मूल्य हैं जो फ्रेम से फ्रेम में बदलते हैं जो अंतिम परिवर्तन मैट्रिक्स को निर्धारित करने में मदद करने के लिए आवश्यक हैं। इस डेटा को CPU से - GPU पर भेजना धीमा है। इसके अलावा, सीपीयू पर, गणना एक बार की जाती है, जबकि GPU पर, वे प्रत्येक शीर्ष के लिए किया जाएगा।


"GPU पर वास्तव में धीमी" भाग को लिखो; यह एक बहुत व्यापक कथन है। यदि आप GPU पर प्रत्येक शीर्ष के लिए मैट्रिक्स का निर्माण करने के बारे में बात कर रहे हैं तो आपका प्रदर्शन आपके बाधाओं पर निर्भर करेगा। यदि आप GPU पर बंधे हुए ALU / रजिस्टर हैं, तो आपको केवल धीमा प्रदर्शन ही मिलेगा, जो कि जरूरी नहीं है। सीपीयू पर ठीक यही काम करना भी इन अड़चनों के तहत धीमा होगा। एक उदाहरण है, जहां यह है आमतौर पर GPU पर किया: मक्खी पर शिखर shaders निर्माण शिखर स्पर्श अंतरिक्ष मैट्रिक्स शिखर बैंडविड्थ लाने को बचाने के लिए। फिर से, अपनी अड़चनों पर निर्भर है, इसलिए YMMV।
जपवर

मैं नीचे नहीं जा सकता, लेकिन इस जवाब को कम किया जाना चाहिए। "वास्तव में GPU पर धीमा" कहना बहुत गलत है।
एडम

3

गैर-GPU प्रोसेसर पर कई ज्यामितीय परिवर्तन किए जा सकते हैं, हालांकि किसी को लक्ष्य प्लेटफ़ॉर्म पर विचार करना चाहिए। आपका माइलेज आपके द्वारा लक्षित किए गए प्लेटफ़ॉर्म और उस प्लेटफ़ॉर्म की बाधाओं के आधार पर अलग-अलग होगा।

एक विचार डिवाइस के बीच बस बैंडविड्थ है जो ज्यामिति उत्पन्न कर रहा है, और वह उपकरण जो ज्यामिति का प्रतिपादन कर रहा है।

एक विशिष्ट आधुनिक पीसी प्रणाली में, सीपीयू PCIe बस के एक तरफ (http://en.wikipedia.org/wiki/PCI_Express) है, और दूसरी तरफ GPU है। एक ही तरीका है कि आप CPU से GPU (और इसके विपरीत) प्रति-फ्रेम जनरेट डेटा को ट्रांसफर कर सकते हैं। इसका मतलब है, आप इस बस की ट्रांसफर स्पीड तक सीमित रह सकते हैं। यदि आपके टारगेट प्लेटफॉर्म में 16 लेन के साथ PCIe 2.x है, तो आपके पास 8GB / s बैंडविड्थ है। व्यवहार में, PCIe में स्थानान्तरण 100% कुशल नहीं हैं, क्योंकि आपके स्थानांतरण के दौरान प्रोटोकॉल के लिए कुछ बैंडविड्थ की खपत होती है। आपके स्थानान्तरण के आकार के आधार पर, आप प्रति-पैकेट ओवरहेड पर अपने बैंडविड्थ का 5-10% खो सकते हैं।

जैसे। पीसी प्लेटफॉर्म जो कि 16 लेन के साथ PCIe 2.x चला रहा है, को देखते हुए, आप GPU को खिलाने के लिए प्रति फ्रेम कितना डेटा उत्पन्न कर सकते हैं? मान लें कि आप 60fps पर रन चाहते हैं, यह PCIe 2.x के लिए 8GB / 60 = 136MB प्रति फ्रेम में तब्दील हो जाता है। ड्राइवर संचार ओवरहेड और PCIe ट्रांसफर प्रोटोकॉल ओवरहेड के लिए कुछ (अनुमानित) 90% कारक से गुणा करके, आप PCIe 2.x बैंडविड्थ द्वारा सीमित किए बिना प्रति फ्रेम लगभग 120Mb डेटा उत्पन्न कर सकते हैं।

एक और सवाल जिसका आपको जवाब देना है: क्या इस 120Mb डेटा की पीढ़ी आपके टारगेट सीपीयू पर 1/60 वें सेकंड में आसानी से प्राप्त हो जाएगी? यह याद रखते हुए कि आपको अपने सीपीयू पर कई अन्य गेम कार्य करने हैं, आप रूपांतरित डेटा को उत्पन्न करने के लिए समय की कमी में भाग सकते हैं। सिर्फ शुद्ध ALU थ्रूपुट के संदर्भ में, यह आपको CPU पर सीमित कर सकता है। CPU से sysmem बसों के संदर्भ में, आप बैंडविड्थ द्वारा भी सीमित हो सकते हैं (जो भिन्न होता है, लेकिन हाल के सीपीयू पर लगभग 8.5GB / s है)।

ठीक है, तो क्या कारकों यह एक GPU पर करने के लिए और अधिक व्यवहार्य बनाता है? एक कारक GPU मेमोरी बैंडविड्थ है, जो GPU के बीच बैंडविड्थ है और यह स्थानीय वीडियो मेमोरी है। समकालीन मिड-रेंज जीपीयू पर यह वीडियो मेमोरी बैंडविड्थ 200GB / s के बराबर हो सकता है (हाँ, यह 25x PCIe 2.50 बैंडविड्थ है)। एक अन्य कारक यह है कि GPU व्यापक रूप से समानांतर है, इसमें सैकड़ों ALU हैं और एक समय में हजारों थ्रेड चलाकर मेमोरी एक्सेस विलंबता को छिपाने में सक्षम है।

ये सभी कारक GPU पर अधिक काम करने की स्पष्ट जीत में योगदान कर सकते हैं, लेकिन आपके लक्ष्य प्लेटफॉर्म के आधार पर फिर से YMMV।


1

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

या क्या आपका मतलब कुछ कट्टर लोगों से है, जैसे सामान्य वेक्टर गणित के लिए GPU का उपयोग करना? इन दिनों हमारे पास सामान्य प्रयोजन के GPU हैं जो CUDA जैसी प्रणालियों के माध्यम से काफी सामान्य सी कोड चला सकते हैं। भारी वेक्टर गणित के लिए इसका लाभ उठाना संभव है, और मुझे पता है कि वहाँ कार्यक्रम हैं जो ऐसा करते हैं। हालांकि मुझे व्यक्तिगत रूप से इसका कोई अनुभव नहीं है।


प्रश्न को स्पष्ट करने में सहायता के लिए "मेष परिवर्तन" को "ज्यामितीय परिवर्तन" में बदल दिया। मैं भी opencl es का इंतजार कर रहा हूं, जो अगले साल की शुरुआत में उपलब्ध हो सकता है।
ज़मदत

0

ऐसी परिस्थितियाँ होती हैं जहाँ GPU पर प्रदान की गई सभी चीजें समझ में आती हैं, लेकिन आप एक छाया के अंदर स्थिरांक स्थापित नहीं कर सकते हैं और ड्रॉ कॉल से पहले सीपीयू पक्ष को छोड़कर उन्हें स्थापित करने के लिए वास्तव में कोई और नहीं है।

यहां तक ​​कि अगर आप कस्टम स्थिरीकरण कार्यक्रम के साथ GPU पर अस्थि परिवर्तन मैट्रिक्स की तरह अपने स्थिरांक की गणना कर सकते हैं, तो आप शायद चाहते हैं। GPU समानांतर निष्पादन में वास्तव में अच्छा है, लेकिन इसमें बहुत धीमी गति है।

एक पदानुक्रम को बदलना सामान्य रूप से समानांतर नहीं है, क्योंकि बच्चे के नोड्स माता-पिता पर निर्भर करते हैं, लेकिन सभी कोने को एक जाल में बदलना है, क्योंकि कोने एक दूसरे से कम्प्यूटेशनल स्वतंत्र हैं।

सामान्य नियम है:

  • सीरियल प्रोसेसिंग: सीपीयू
  • समानांतर प्रसंस्करण: जीपीयू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.