समान आर्किटेक्चर के नए प्रोसेसर के लिए इंजन को अनुकूलित करने की आवश्यकता क्यों है?


39

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


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
जोश

14
"नीड" एक गलत शब्द है, और सत्य से अधिक मार्केटिंग है, उसी तरह जैसे कि विंडोज को एक निश्चित नई सीपीयू पीढ़ी का समर्थन करने की आवश्यकता है (या विंडोज 7 के मामले में, जो सिद्धांत रूप में पूरी तरह से काम करेगा। उदाहरण के लिए, Ryzen के साथ ठीक है, आवश्यकता से 3-4% अधिक शक्ति का उपयोग करने के अलावा)। यह ट्यूनिंग केवल सीपीयू से थोड़ा अधिक निचोड़ने की कोशिश करने के बारे में है, अधिकतम के करीब हो रही है। वास्तविक रूप से, आप विभिन्न शेड्यूलिंग और नए निर्देशों के एक जोड़े का उपयोग करने के कारण गैर-संदर्भित उदाहरणों में कुल मिलाकर 1-2% हासिल करने में सक्षम हो सकते हैं।
डेमोन

2
सिर्फ इसलिए कि दो प्रोसेसर एक ही ऑपरेशन कर सकते हैं, जिसका मतलब यह नहीं है कि ऑपरेशन दोनों प्रोसेसर पर समान प्रदर्शन है ...
मेहरदाद

स्टैक ओवरफ्लो पर मेरा एक संबंधित प्रश्न देखें: mtune वास्तव में कैसे काम करता है?
मार्क.2377

जवाबों:


54

क्योंकि एक ही वास्तुकला की विभिन्न पीढ़ियों में अलग-अलग निर्देश सेट हो सकते हैं

उदाहरण के लिए, स्ट्रीमिंग SIMD एक्सटेंशन शायद सबसे प्रसिद्ध x86 इंस्ट्रक्शन सेट है, लेकिन फिर भी, और वहां सिर्फ एक x86 आर्किटेक्चर होने के बावजूद, SSE, SSE2, SSE3 और SSE4 मौजूद हैं।

इन पीढ़ियों में से प्रत्येक में नए निर्देश शामिल हो सकते हैं जो निश्चित संचालन करने के तेज़ तरीके प्रदान करते हैं। एक उदाहरण जो खेलों के लिए प्रासंगिक होगा वह डॉट उत्पाद निर्देश हो सकता है।

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


1
@Panzercrisis - संपादन सुझाव के लिए धन्यवाद। स्पष्ट होने के लिए: मूल प्रश्न आपके स्वयं के कोड के बारे में नहीं था, यह इंजन कोड के बारे में था, इसलिए "अपने स्वयं के कोड को अनुकूलित करें" एक अच्छा संपादन सुझाव नहीं है। हालाँकि, इसने इस बात को उजागर किया कि मुझे यह स्पष्ट करने की आवश्यकता है कि जब मैंने "ऑप्टिमाइज़" कहा था तो मेरा मतलब था "इंजन कोड को ऑप्टिमाइज़ करें", इसलिए मैंने इसे लेने के लिए संपादित किया है।
मैक्सिमस मिनिमस

37

मैक्सिमस का जवाब सही है, मैं सिर्फ कहानी का एक और टुकड़ा देना चाहता हूं:

हार्डवेयर अपने आप में एक तरह से बदल जाता है, आपको नए कोडों की परवाह किए बिना कोड को कैसे बदलना चाहिए।

  • कैश की मात्रा में वृद्धि या कमी का अर्थ है कि आपको कैश ऑप्टिमाइज़ेशन / कैश अमान्य होने के मुद्दों के बारे में कम या अधिक चिंता करने की आवश्यकता है। अधिक कैश का अर्थ है छोटे डेटा के साथ आप यह सुनिश्चित करने पर कम ध्यान केंद्रित कर सकते हैं कि डेटा प्रदर्शन चिंताओं में भाग लेने के साथ सन्निहित है। कम कैश का मतलब है कि यह एक मुद्दा हो सकता है, और कुछ बड़ी डेटा संरचनाओं के साथ बहुत कम कैश का मतलब है यह किसी भी तरह से कोई फर्क नहीं पड़ेगा।

  • कैश के नए स्तरों का मतलब है कि आपको इस बारे में अधिक सोचने की ज़रूरत है कि आप डेटा के बड़े सेट (एल 1, एल 2, बनाम एल 3 बनाम एल 4) को कैसे व्यवस्थित करते हैं।

  • अधिक कोर का मतलब है कि आपको यह सोचने की ज़रूरत है कि आप मल्टी थ्रेड एप्लिकेशन को बेहतर तरीके से कैसे ले जा रहे हैं, और मल्टी प्रोसेस एनवायरनमेंट में आपका एप्लिकेशन कैसे स्केल होता है।

  • तेज़ घड़ियों का मतलब है कि आपको अपने सिस्टम की अड़चन के रूप में सीपीयू कम्प्यूटेशन स्पीड के बारे में सोचने की ज़रूरत से ज़्यादा मेमोरी लेटेंसी के बारे में सोचना शुरू करना होगा।

  • किसी सिस्टम पर FPU की संख्या अब किसी भी अधिक पूर्णांक ALUs की संख्या से मेल नहीं खा सकती है (AMD के पास इस तरह के आर्किटेक्चर हैं / हैं)।

  • मेरे द्वारा घटाये गये, या बढ़े हुए किसी ऑपरेशन की गणना करने में लगने वाले घड़ी चक्रों की संख्या।

  • उपलब्ध रजिस्टरों की संख्या बदल गई।

इन सभी का उन कार्यक्रमों पर बहुत वास्तविक प्रदर्शन प्रभाव पड़ता है जो एक ही आईएसए के साथ पिछले हार्डवेयर में अंतर्निहित वास्तुकला के बारे में धारणाएं बनाते हैं, या तो सकारात्मक या नकारात्मक।


"कैश के स्तर में वृद्धि या कमी का मतलब है कि आपको कैश सुसंगतता के बारे में कम चिंता करने की आवश्यकता है।" - वस्तुतः कोई भी सीपीयू कैश सुसंगत है। क्या आप झूठे बंटवारे का मतलब है? यहां तक ​​कि वस्तुतः किसी भी सीपीयू $ लाइन में लगभग हमेशा 64 बी होता है ...
मिकीज पीचोटका

1
Maciej सिर्फ कैश कोहेरेंसी के बारे में आपका बयान ले रहा था :) आपका शायद "कैश ऑप्टिमाइज़ेशन" या कुछ और था। Cache coherence एक प्रणाली की क्षमता है जो N को स्वतंत्र कैश की मौजूदगी में भी सॉफ़्टवेयर के लिए पारदर्शी रूप से याद रखने के एक निरंतर दृष्टिकोण को बनाए रखता है । यह आकार के लिए पूरी तरह से ऑर्थोगोनल है। टीबीएच कथन वास्तव में प्रासंगिक नहीं है, लेकिन आपका उत्तर (विशेषकर अंक 5 और 6) प्रश्न को स्वीकार किए गए एक आईएमओ से बेहतर तरीके से संबोधित करता है :) शायद वास्तुकला और यू-आर्किटेक्चर के बीच के अंतर पर जोर देने से यह अधिक बाहर खड़ा हो जाएगा।
मार्गरेट ब्लूम

4
"जैसे गुणा से अधिक समय लग रहा है, जहां आज के रूप में आधुनिक इंटेल और amd CPUS में उतना ही समय लगता है" यह सब सच नहीं है। पाइपलाइन किए गए आर्किटेक्चर में आपको विलंबता (जब परिणाम तैयार होता है) और थ्रूपुट (कितने आप अपने चक्र के दौरान कर सकते हैं) के बीच अंतर करना होगा। आधुनिक इंटेल प्रोसेसर पर इंट के अलावा 4 का एक थ्रूपुट है और 1. की एक विलंबता है। गुणन में 1 और अक्षांश 3 (या 4) है। ये ऐसी चीजें हैं जो प्रत्येक वास्तुकला के साथ बदलती हैं और अनुकूलन की आवश्यकता होती है। Eg बुद्धि pdepपर 1 चक्र लेता है, लेकिन 6 Ryzen पर तो Ryzen पर इसका उपयोग नहीं करना चाहता हो सकता है।
क्रिस्टोफ

2
@ क्लेयर मुझे पता है कि हम यहां सीपीयू के बारे में बात कर रहे हैं, लेकिन आपने कभी GPU के लिए प्रोग्राम नहीं किया है? एक ही कोड प्रदर्शन में ऐसे बेतहाशा भिन्न परिणाम उत्पन्न करता है कि अक्सर आप CUDA में हार्डवेयर क्षमताओं पर विचार करने के लिए मजबूर हो जाते हैं । यही कारण है कि मैं इसके साथ आया था, कैश आकार (साझा मेमोरी, प्रबंधित L1 कैश) वास्तव में इस बात पर ध्यान देने की आवश्यकता है कि आप CUDA में किसी चीज़ के लिए कैसे कोड करते हैं।
whn

2
@Christoph सही है। आपके द्वारा लिंक किया गया बेंचमार्क किसी सरणी पर एक लूप के लिए है c[i] = a[i] OP b[i](अर्थात 2 लोड और प्रति ऑपरेशन 1 स्टोर) इसलिए समय बहुत कम कम्प्यूटेशनल तीव्रता के कारण मेमोरी बैंडविड्थ पर हावी है। अगर यह L1D में फिट है तो सरणी का आकार इतनी IDK नहीं दिखाया गया है। ( gcc4.9 -Ofastबहुत संभावना है कि उन छोरों को ऑटो-वेक्टर किया जाए, इसलिए आप जटिल पूर्णांक कोड के हिस्से के रूप में सामान्य स्केलर संचालन की लागत को भी नहीं माप सकते हैं)। उस पृष्ठ की पहली पंक्ति महत्वपूर्ण है: उपयोगी प्रतिक्रिया से पता चला है कि इनमें से कुछ उपाय गंभीर रूप से त्रुटिपूर्ण हैं। एक प्रमुख अद्यतन रास्ते में है
पीटर कॉर्ड्स

2

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

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

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