x86-64

2012-04-25 13 views
13

के लिए कैश करने के लिए डेटा को प्रीफेच करना मेरे आवेदन में, एक बिंदु पर मुझे स्मृति डेटा (एमबी के 100s) के एक बड़े संगत ब्लॉक पर गणना करने की आवश्यकता है। मैं जो सोच रहा था वह ब्लॉक के हिस्से को प्रीफेच करना था, मेरा प्रोग्राम भविष्य में छूएगा, ताकि जब मैं उस हिस्से पर गणना करता हूं, तो डेटा पहले से ही कैश में है।x86-64

क्या कोई मुझे जीसीसी के साथ इसे प्राप्त करने का एक सरल उदाहरण दे सकता है? मैंने कहीं _mm_prefetch पढ़ा है, लेकिन यह नहीं पता कि इसका सही तरीके से उपयोग कैसे किया जाए। यह भी ध्यान रखें कि मेरे पास एक मल्टीकोर सिस्टम है, लेकिन प्रत्येक कोर समानांतर में स्मृति के एक अलग क्षेत्र पर काम करेगा।

+6

यदि स्मृति पहुंच अनुक्रमिक है, तो हार्डवेयर प्रीफ़ेचर पहले से ही आपके लिए यह करेगा। तो आपको मैन्युअल प्रीफेचिंग के साथ शायद अधिक सुधार नहीं मिलेगा। – Mysticial

+6

इस सवाल को एक उदाहरण के लिए देखें जहां प्रीफेचिंग वास्तव में मदद करता है: http://stackoverflow.com/questions/7327994/prefetching-examples – Mysticial

+2

आपका मतलब है कि हार्डवेयर प्रीफ़ेचर किसी भी तरह से पहचानता है कि मैं स्मृति में संगत क्षेत्रों का उपयोग कर रहा हूं और उन हिस्सों को कैश में ला रहा हूं ? – pythonic

उत्तर

16

gcc अंतर्निहित निर्देशों के लिए इंटरफ़ेस के रूप में अंतर्निहित कार्यों का उपयोग करता है। विशेष रूप से आपके मामले __builtin_prefetch के लिए। लेकिन उन मामलों में इसका उपयोग करते समय आपको केवल एक मापनीय अंतर देखना चाहिए जहां एक्सेस पैटर्न स्वचालित रूप से भविष्यवाणी करना आसान नहीं है।

13

आधुनिक CPUs में बहुत अच्छा स्वचालित प्रीफ़ेच है और आप अच्छी तरह से खोज सकते हैं कि यदि आप सॉफ़्टवेयर प्रीफेचिंग शुरू करने का प्रयास करते हैं तो आप अच्छे से अधिक नुकसान करते हैं। यदि आपको लगता है कि वास्तव में एक प्रदर्शन समस्या है तो आप ऑप्टिमाइज़ेशन के लिए बहुत अधिक "कम लटकते फल" पर ध्यान केंद्रित कर सकते हैं। प्रीफेच आखिरी चीजों में से एक होता है जिसे आप कोशिश कर सकते हैं, जब आप कुछ और प्रतिशत थ्रूपुट के लिए हताश होते हैं।

+4

+1 मैंने कम से कम 10 अलग-अलग अवसरों पर प्रीफेचिंग का प्रयास किया है। केवल एक बार मैंने एक उल्लेखनीय गति प्राप्त करने का प्रबंधन भी किया। (जिसे मैंने टिप्पणियों में जोड़ा था।) – Mysticial

+4

सहमत - कम परिष्कृत स्वचालित प्रीफेचिंग वाले पुराने CPUs पर भी सॉफ्टवेयर प्रीफेच से कोई लाभ प्राप्त करना हमेशा कठिन होता था - मुख्य समस्या यह है कि आपको आमतौर पर कुछ सौ घड़ी चक्र prefetch शुरू करने की आवश्यकता होती है समय से पहले और निश्चित रूप से आपको कुछ अतिरिक्त मेमोरी बैंडविड्थ की आवश्यकता है जिसका आप लाभ उठा सकते हैं, जो अक्सर उच्च प्रदर्शन कोड में नहीं होता है। –

+1

प्रीफेच आवश्यक नहीं है - जब तक यह आवश्यक न हो। मेरे वर्तमान एप्लिकेशन में - मेमोरी एक्सेस पैटर्न हार्डवेयर प्री-फ़ेचर द्वारा नहीं देखे गए थे। और दुर्भाग्यवश - उन पहुंच पैटर्न को अधिक पूर्व-फ़ेचर अनुकूल बनाने के लिए एक विकल्प नहीं था। इसलिए - _mm_prefetch। थ्रुपुट ~ 10% नीचे चला गया, लेकिन हमने विलंबता संख्या हासिल की जो हम चाहते थे। यह एक बहुत ही सचेत व्यापार था जो पेर्फ और वीट्यून के माध्यम से बहुत अधिक प्रोफाइलिंग के बाद किया गया था। – quixver

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

  • कोई संबंधित समस्या नहीं^_^