2015-12-23 5 views
7

मैं विकिपीडिया कि अक्षम करने सीपीयू कैश के प्रदर्शन में सुधार कर सकते हैं पर पढ़ें:मैं कुछ मेमोरी क्षेत्रों के लिए सीपीयू कैश को कैसे अक्षम कर सकता हूं?

कुछ स्मृति अंकन गैर संचित करने योग्य के रूप में पर्वतमाला के प्रदर्शन में सुधार कर सकते हैं स्मृति क्षेत्रों है कि शायद ही कभी फिर से पहुंचा जा सकता है की कैशिंग से बचकर,।

जब मैंने लिनक्स पर सी में इसे कैसे किया, तो मुझे कुछ भी नहीं मिला। ऐसा नहीं है कि मुझे वास्तव में इस सुविधा की ज़रूरत है लेकिन मुझे वैसे भी दिलचस्पी है।

और क्या आप इस अनुकूलन का उपयोग करने वाली किसी भी परियोजना के बारे में जानते हैं?

संपादित करें: मैं x86_64

+0

यह अत्यधिक मंच निर्भर है। आप किस मंच के लिए प्रोग्रामिंग कर रहे हैं? – fuz

+1

आपका प्रश्न यहां उत्तर दिया गया है http://stackoverflow.com/questions/9544094/c-working-with-the-cpu-cache – Abstraction

+0

@ एब्स्ट्रक्शन उत्तर विंडोज से संबंधित है, लेकिन ओपी लिनक्स का उपयोग कर रहा है। इसके अलावा, गलत भाषा। – fuz

उत्तर

6

गैर कैशिंग के बारे में है कि टिप्पणी के लिए प्रोग्रामिंग कर रहा हूँ मतलब यह नहीं है कि आप क्या सोचते तो इसका मतलब है, और जहां यह प्रयोग किया जाता है, यह आमतौर पर एक उपयोगकर्ता के सुलभ सुविधा नहीं है। यही है, सीपीयू कैश नियंत्रण आमतौर पर एक विशेषाधिकार प्राप्त ऑपरेशन है।

कहा ...

- एक सामान्य उपयोगकर्ता कार्यक्रम कौन है गुण 'हॉट' या "ठंडा" जाने के लिए संकलक तरीके कि उपयोग करेंगे में कार्य समूह के लिए लोडर बता रहे हैं कार्यों के साथ निर्माण किया जा सकता है सबसे उपयोगी रूप से कैश।

- एक सामान्य प्रोग्राम पेजिंग फ़ंक्शन को विभिन्न चीजों को बताने के लिए लिनक्स में पागल() फ़ंक्शन का उपयोग कर सकता है, जिसमें तथ्य यह है कि स्मृति का उपयोग अभी किया गया है या जल्द ही उपयोग नहीं किया जा सकता है।

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

"सामान्य डेटा ™" जैसे कि आप किसी भी सी प्रोग्राम में उपयोग करने की संभावना रखते हैं अनिवार्य रूप से किसी भी डेटा को कैश-योग्य नहीं चिह्नित करने से कभी लाभ नहीं होता है। प्रदर्शन सुधार जो कैश किए गए डेटा का आनंद लेता है, वह विभिन्न कैश-फ्लश और मेमोरी बाrier ऑपरेशंस की अनुपस्थिति है जो स्मृति मैप किए गए डिवाइस और डिस्प्ले बफर को लगभग लगातार आवश्यकता होगी। उदाहरण के लिए, मेमोरी मैप किए गए डिवाइस पर कैश डालना, उदाहरण के लिए, प्रत्येक पठन से पहले एक कैश अमान्य आदेश की आवश्यकता होगी और प्रत्येक कैश के बाद कैश को लिखने के लिए कमांड कमांड की आवश्यकता होगी ताकि यह सुनिश्चित किया जा सके कि पढ़े और लिखने के लिए आवश्यक सटीक पल में हो। यह कैश के उपयोग को "जहर" करेगा, कैश लाइनों (शारीरिक रूप से सीमित संसाधन) को सबसे अधिक असभ्य और अनुपयोगी तरीके से हटाकर तुरंत हटा देगा।

दुर्लभ मामले में आप एक प्रोग्राम लिखते हैं जो इन कैशों में से एक को हानिकारक क्षेत्रों तक पहुंच प्राप्त करता है - जैसे कि यदि आपने लिनक्स सिस्टम पर एक्स डिस्प्ले सर्वर का हिस्सा लिखा है - कर्नेल पहले ही रजिस्टरों को सेट कर लेता डिवाइस के लिए और गैर-कैश व्यवहार आपके लिए पारदर्शी होगा।

प्रभावी रूप से ऐसा कोई समय नहीं है जहां आपका सामान्य अनुप्रयोग ग्रेड प्रोग्राम विभिन्न चरवाहे() प्रकार के उपयोग से परे कैश के लिए हानिकारक के रूप में एक चर को चिह्नित करने की किसी भी क्षमता से लाभान्वित हो रहा है।

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

फिर से उसी उदाहरण पर वापस जाने के लिए, यदि आप आवश्यक ड्राइवर लिख रहे थे, जब आप डिस्प्ले एडाप्टर हार्डवेयर या पीसीआई बस पर पढ़ रहे थे तो विभिन्न झंडे और तकनीकों को दस्तावेज और चर्चा की जाएगी हार्डवेयर गाइड में।

कैश निकास को खींचने और इंटेल प्लेटफ़ॉर्म पर CLCLEAR निर्देश जैसी चीजों के साथ उपयोगकर्ता स्थान से ऐसे तरीके हैं। ये तकनीक नहीं सामान्य प्रदर्शन में सुधार करेगी।

चूंकि यह एक Linux सिस्टम पर एक विशेषाधिकार प्राप्त आपरेशन है, तो आप एक कर्नेल ड्राइवर कि हासिल कर लिया और कैश न करने योग्य के रूप में स्मृति का एक क्षेत्र के रूप में चिह्नित है और फिर आप अपने आवेदन में यह नक्शा जाने लिख सकते हैं। लेकिन इस तरह के एक क्षेत्र की आवश्यकता इतनी दुर्लभ है, और इस तरह दुरुपयोग की संभावना है कि जगह पर ऐसा करने के लिए सामान्य पद्धति नहीं है।

तो आप इसे कैसे करते हैं? आप कम से कम नहीं, आप आज नहीं हैं। जब आप बहु-थ्रेडेड कोड और डेटा सिंक्रनाइज़ेशन समस्याओं के अंतरंग विशेषता ज्ञान के साथ कर्नेल ड्राइवर लेखक बन जाते हैं, तो आप जान लेंगे कि आप इसे कैसे कर सकते हैं, और उस समय आपको पता चलेगा कि आप क्यों नहीं छोड़ना चाहते हैं अखिरी सहारा।

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

पीएस इसके अलावा, किसी ने कहा है कि किसी ने पहले से ही उन चीजों की ओर इशारा किया है जो इस आलेख को http://lwn.net/Articles/255364/ तक ले जाते हैं जो आपके प्रोग्राम को बहुत कैश अनुकूल बनाने के तरीके को कवर करता है और कुछ तरीकों से आप कुछ कैश बाईपास ऑपरेशंस को बहुत सस्ते तरीके से कर सकते हैं। उदाहरण के लिए स्मृति सेट करते समय मेमसेट() का उपयोग कैश के चारों ओर जाता है, और कुछ ऑपरेशन कैश को "पिछली स्ट्रीम" कर सकते हैं। यह वही बात नहीं है जो आप पूछते हैं, लेकिन एक बार जब आप उस लेख को समझ लेते हैं तो आपको एक बेहतर समझ होगी कि यादृच्छिक रूप से स्मृति के क्षेत्र को चिह्नित करने के कारण क्यों सामान्य रूप से जेडी कहते हैं, समाधान नहीं खोज रहे हैं

0

हाल ही में मुझे कैश-भारी बहु-थ्रेडेड एप्लिकेशन में अनचाहे मेमोरी के साथ प्रयोग करने की आवश्यकता है।

मैं इस kernel module के साथ आया जो उपयोगकर्ताओं के लिए बिना किसी स्मृति को मैप करने की अनुमति देता है।

उपयोगकर्ता प्रक्रिया मॉड्यूल के वर्ण डिवाइस पर mmap() को कॉल करके अनचाहे स्मृति अनुरोध (डेमो के लिए परीक्षण निर्देशिका देखें)।

What every programmer should know about memory वास्तव में पढ़ना आवश्यक है!

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

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