ग्राफिक्स एपीआई के लिए थ्रेड सुरक्षा इतनी बड़ी बात क्यों है?


21

वल्कन और डायरेक्टएक्स 12 दोनों को थ्रेड-सेफ तरीके से उपयोग करने योग्य होने का दावा किया जाता है। लोग उसको लेकर उत्साहित दिख रहे हैं।

इसे इतनी बड़ी विशेषता क्यों माना जाता है? "वास्तविक" प्रसंस्करण वैसे भी एक अलग प्रसंस्करण इकाई पर स्मृति पुल पर फेंक दिया जाता है।

इसके अलावा, अगर यह इतना बड़ा है, तो यह अब तक क्यों नहीं है कि एक थ्रेड सेफ ग्राफिक्स एपीआई सामने आया?


यह लेख बहुत अधिक "गेमर केंद्रित" है, लेकिन यह आपको कुछ जानकारी दे सकता है ... pcgamer.com/what-directx-12-means-for-gamers-and-developers
glampert

जवाबों:


13

मुख्य लाभ यह होगा कि ग्राफिक्स एपीआई तक पहुंचने के साथ सभी मुश्किल मुद्दों को हल करने के बिना सीपीयू कार्यों को कई थ्रेड में विभाजित करना आसान होगा। आम तौर पर आपको या तो संदर्भ को वर्तमान बनाना होगा (जिसमें खराब प्रदर्शन के निहितार्थ हो सकते हैं) या एक कतार प्रदान करें और ग्राफिक्स एपी को एक ही धागे में कहें। मुझे नहीं लगता कि किसी भी प्रदर्शन को इस तरह से प्राप्त किया जाता है, क्योंकि GPU वास्तव में उन्हें क्रमिक रूप से संसाधित करता है, लेकिन यह डेवलपर के काम को बहुत आसान बनाता है।

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

संपादित करें: मेरा मतलब यह नहीं है कि कई सीपीयू में काम करने से कोई प्रदर्शन प्राप्त नहीं होता है, यह तेजी से बनावट / शेड बनाने के लिए अपनी कॉल को कई थ्रेड में विभाजित करने के लिए उपयोगी नहीं है। बल्कि अधिक प्रोसेसर व्यस्त होने और Gpu को प्रदर्शन के लिए व्यस्त रखने के कारण प्रदर्शन प्राप्त होता है।


1
एक अतिरिक्त नोट के रूप में OpenGL आम तौर पर केवल एक धागे पर काम करता है ताकि एक ग्राफिक्स गहन ऐप एक कोर को अधिकतम कर सके। वल्कन जैसी कोई चीज़ कई थ्रेड्स को आदेशों को एक कतार में भेजने की अनुमति देती है, जिसका अर्थ है कि कई थ्रेड्स से कई ग्राफिक्स कॉल किए जा सकते हैं।
साबुन

9

GPU के लिए एक फ्रेम सेट करने के लिए CPU पर बहुत सारे काम की आवश्यकता होती है, और ग्राफिक्स चालक के अंदर उस काम का एक अच्छा हिस्सा है। DX12 / Vulkan से पहले, ग्राफिक्स ड्राइवर का काम अनिवार्य रूप से एपीआई के डिजाइन द्वारा एकल-थ्रेडेड होने के लिए मजबूर किया गया था।

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

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

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

यह उन बड़ी चीजों में से एक है जो DX12 / Vulkan में बदल गई हैं। एक बात के लिए, वे लगभग सभी ग्राफिक्स पाइपलाइन राज्य को एक ऑब्जेक्ट में शामिल करते हैं, और दूसरे के लिए (कम से कम DX12 में) जब आप एक कमांड सूची बनाना शुरू करते हैं तो आपको एक प्रारंभिक पाइपलाइन राज्य प्रदान करना होगा ; राज्य को एक कमांड सूची से दूसरे में विरासत में नहीं मिला है। सिद्धांत रूप में, यह ड्राइवर को पिछली कमांड सूचियों के बारे में कुछ भी जानने की अनुमति नहीं देता है, इससे पहले कि वह संकलन शुरू कर सके- और बदले में यह एप्लिकेशन को पूरी तरह से संकलित कमांड सूचियों का उत्पादन करते हुए, समानांतर समानांतर खंडों में इसके प्रतिपादन को तोड़ने की अनुमति देता है, जो तब हो सकता है कम से कम उपद्रव के साथ GPU के लिए एक साथ भेजा और भेजा।

बेशक, नए एपीआई में कई अन्य बदलाव हैं, लेकिन जहां तक ​​मल्टीथ्रेडिंग की बात है, तो यह सबसे महत्वपूर्ण हिस्सा है।


5

आधुनिक जीपीयू में आम तौर पर एक सिंगल फ्रंटेंड सेक्शन होता है जो सीपीयू से कमांड की एक पूरी तरह से रैखिक धारा को संसाधित करता है। क्या यह एक प्राकृतिक हार्डवेयर डिज़ाइन है या यदि यह केवल उन दिनों से बाहर निकलता है जब GPU के लिए एक एकल CPU कोर जनरेटिंग कमांड डिबेट योग्य है, लेकिन यह अभी के लिए वास्तविकता है। इसलिए यदि आप स्टेटफुल कमांड्स की सिंगल लीनियर स्ट्रीम जेनरेट करते हैं, तो निश्चित रूप से सीपीयू पर सिंगल थ्रेड पर रैखिक रूप से उस स्ट्रीम को जेनरेट करना समझ में आता है! सही?

खैर, आधुनिक जीपीयू में भी आम तौर पर एक बहुत ही लचीला एकीकृत बैकेंड होता है जो एक ही बार में बहुत सारी चीजों पर काम कर सकता है। आम तौर पर, जीपीयू काफी बारीक ग्रैन्युलैरिटी पर कोने और पिक्सेल पर काम करता है। जीपीयू प्रसंस्करण 1024 एक कोने में ड्रा और दो अलग-अलग ड्रा में 512 + 512 कोने के बीच बहुत अंतर नहीं है।

यह कम काम करने के लिए एक काफी स्वाभाविक तरीका बताता है: एक ही ड्रॉ कॉल में GPU पर बड़ी संख्याओं को फेंकने के बजाय, अपने मॉडल को अनुभागों में विभाजित करें, उन अनुभागों पर सस्ते मोटे कोयले करें, और प्रत्येक पास को व्यक्तिगत रूप से जमा करें यदि यह पास हो जाता है पुलिंग परीक्षण। यदि आप इसे सही ग्रैन्युलैरिटी पर करते हैं तो आपको एक अच्छा स्पीडअप मिलना चाहिए!

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

यह क्या उबाल है कि आपके पास ड्रॉ कॉल के लिए एक बजट है जो पूरी तरह से चालक के ओवरहेड द्वारा लगाया गया है । (मुझे लगता है कि मैंने सुना है कि इन दिनों आप 60 एफपीएस शीर्षक के लिए लगभग 5,000 प्रति फ्रेम के साथ दूर हो सकते हैं।) आप इस कमांड स्ट्रीम को समानांतर क्रम में बनाकर एक बड़े प्रतिशत तक बढ़ा सकते हैं।

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

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