2014-04-07 12 views
10

हाल ही में हर्ब सटर ने "Modern C++: What You Need to Know" पर एक अच्छी बात की। इस बात का मुख्य विषय दक्षता और डेटा इलाके और मेमोरी मामलों तक पहुंच कैसे था। उन्होंने यह भी समझाया है कि सीपीयू द्वारा मेमोरी (सरणी/वेक्टर) की रैखिक पहुंच कैसे पसंद की जाएगी। उन्होंने इस विषय पर एक अन्य शास्त्रीय संदर्भ "Game performance by Bob Nystrom" से एक उदाहरण लिया है।सी ++ में निर्देश कैश अनुकूल प्रोग्राम कैसे लिखें?

इन लेखों को पढ़ने के बाद, मुझे मिल गया वहाँ कैश के दो प्रकार है जो प्रभाव कार्यक्रम प्रदर्शन है कि:

  1. डेटा कैश
  2. निर्देश कैश

Cachegrind उपकरण भी दोनों कैश प्रकार उपायों हमारे कार्यक्रम की वाद्ययंत्र जानकारी। पहले अंक कई लेख/ब्लॉग और अच्छी डेटा कैश दक्षता (डेटा इलाके) को कैसे प्राप्त किया गया है, द्वारा समझाया गया है।

हालांकि मुझे निर्देश कैश पर अधिक जानकारी नहीं मिली और बेहतर प्रदर्शन प्राप्त करने के लिए हमें किस कार्यक्रम की देखभाल करनी चाहिए? मेरी समझ के अनुसार, हम (प्रोग्रामर) पर अधिक नियंत्रण नहीं है जिस पर निर्देश या कौन सा आदेश निष्पादित किया जाएगा।

छोटे सी ++ प्रोग्राम बताते हैं कि यह काउंटर (.i.e निर्देश कैश) हमारे लेखन कार्यक्रम की शैली के साथ कैसे भिन्न होगा, यह वास्तव में अच्छा होगा। इस बिंदु के संबंध में बेहतर प्रदर्शन प्राप्त करने के लिए सबसे अच्छा अभ्यास प्रोग्रामर क्या करना चाहिए?

मेरा मतलब है कि हम डेटा कैश विषयों के बारे में समझ सकते हैं यदि हमारा प्रोग्राम (वेक्टर बनाम सूची) इसी तरह से दूसरे बिंदु के बारे में समझा सकता है। इस सवाल का मुख्य उद्देश्य इस विषय को यथासंभव समझना है।

+1

आभासी कार्यों से बचें, और जटिल लूप को छोटे लूप में तोड़ दें। – lpapp

+1

@ लियोर: किस तरह से डुप्लिकेट है? – lpapp

+0

क्षमा करें, मैंने गलत सवाल का जिक्र किया है, एक बार जब मैं कंप्यूटर के पास हूं, तो मैं वोट वापस ले जाऊंगा, लेकिन मुझे सकारात्मक है कि कोड कैश संदर्भ के साथ इसका जवाब दिया गया था, जिसमें ट्रेस कैश, डीकोडेड यूओपी कैश इत्यादि शामिल हैं। – Leeor

उत्तर

8

निष्पादन के प्रवाह को बदलने वाला कोई भी कोड निर्देश कैश को प्रभावित करता है। इसमें फ़ंक्शन कॉल और लूप के साथ-साथ फ़ंक्शन पॉइंटर्स को डिफ्रेंसिंग भी शामिल है।

जब कोई शाखा या कूद निर्देश निष्पादित किया जाता है, तो प्रोसेसर को यह निर्णय लेने में अतिरिक्त समय व्यतीत करना पड़ता है कि कोड पहले से ही निर्देश कैश में है या फिर उसे निर्देश कैश (शाखा के गंतव्य से) को फिर से लोड करने की आवश्यकता है या नहीं।

उदाहरण के लिए, कुछ प्रोसेसर में छोटे लूप के लिए निष्पादन कोड रखने के लिए पर्याप्त पर्याप्त निर्देश कैश हो सकता है। कुछ प्रोसेसर में एक बड़ा निर्देश कैश नहीं होता है और इसे सरल पुनः लोड किया जाता है। निर्देश कैश को फिर से लोड करने में समय लगता है जिसे निष्पादन निर्देशों को खर्च किया जा सकता है।

  • लूप unrolling
  • सशर्त अनुदेश निष्पादन (एआरएम प्रोसेसर पर उपलब्ध है)
  • इनलाइन कार्यों
  • निर्देश पाइपलाइन

संपादित करें: 1: प्रोग्रामिंग तकनीक

इन विषयों खोजें बेहतर प्रदर्शनके लिए प्रदर्शन में सुधार और अनुदेश कैश reloading निम्न कार्य को कम करने के लिए:

कम "अगर" बयान को कम से कम करने के लिए अपने कोड डिजाइन "अगर" बयान । इसमें बूलियन बीजगणित शामिल हो सकता है, अधिक गणित या तुलनात्मक सरलीकरण का उपयोग कर (क्या उन्हें वास्तव में आवश्यकता है?)। "तब" और "अन्य" खंडों की सामग्री को कम करने के लिए पसंद करें ताकि संकलक सशर्त असेंबली भाषा निर्देशों का उपयोग कर सकें।

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

उतारना पाश लूप
छोटे पुनरावृत्तियों के लिए, नहीं है, लेकिन पाश की सामग्री (कुछ compilers उच्च अनुकूलन स्तर सेटिंग्स पर ऐसा कर सकते हैं) को दोहराएँ। अधिक सामग्री दोहराई गई, लूप के शीर्ष पर शाखाओं की कम संख्या और निर्देश कैश को फिर से लोड करने की आवश्यकता कम है।

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

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

लिंक किए गए सूचियों को सरणी या अन्य यादृच्छिक-एक्सेस कंटेनर में बदलें। किसी सरणी के तत्वों को गणित का उपयोग करके एक्सेस किया जा सकता है और निष्पादन को बाधित नहीं किया जा सकता है। किसी आइटम को ढूंढने के लिए लिंक्ड सूचियों को ट्रैवर्स (लूप) होना चाहिए।

संबंधित मुद्दे