इस this excellent paper के 6.3.2 में Ulrich Drepper सॉफ़्टवेयर प्रीफेचिंग के बारे में लिखता है। उनका कहना है कि यह "परिचित पॉइंटर पीछा ढांचा" है जिसे मैं इकट्ठा करता हूं वह वह परीक्षण है जो पहले यादृच्छिक पॉइंटर्स को घुमाने के बारे में देता है। यह उनके ग्राफ में समझ में आता है कि जब कार्य सेट कैश आकार से अधिक हो जाता है तो प्रदर्शन पूंछ बंद हो जाता है, क्योंकि तब हम मुख्य स्मृति को अधिक से अधिक बार जा रहे हैं।इस उदाहरण में प्रीफेच स्पीडअप क्यों अधिक नहीं है?
लेकिन प्रीफ़ेच यहां केवल 8% क्यों मदद करता है? अगर हम प्रोसेसर को बिल्कुल बता रहे हैं कि हम क्या लोड करना चाहते हैं, और हम इसे समय से काफी पहले बताते हैं (वह 160 चक्र आगे करता है), कैश द्वारा संतुष्ट हर एक्सेस क्यों नहीं है? वह अपने नोड आकार का जिक्र नहीं करता है, इसलिए केवल कुछ डेटा की आवश्यकता होने पर पूरी लाइन लाने के कारण कुछ अपशिष्ट हो सकता है?
मैं एक पेड़ के साथ _mm_prefetch उपयोग करने के लिए कोशिश कर रहा हूँ और मैं कोई उल्लेखनीय गति को देखते हैं। मैं कुछ इस तरह कर रहा हूँ:
_mm_prefetch((const char *)pNode->m_pLeft, _MM_HINT_T0);
// do some work
traverse(pNode->m_pLeft);
traverse(pNode->m_pRight)
अब जब कि केवल एक तरफ ट्रेवर्सल की मदद करनी चाहिए, लेकिन मैं सिर्फ प्रदर्शन में सब पर कोई परिवर्तन नहीं देखते हैं। मैंने परियोजना सेटिंग्स में एसएसई जोड़ा/आर्क किया था। मैं एक i7 4770 के साथ विजुअल स्टूडियो 2012 का उपयोग कर रहा हूं। this thread में कुछ लोग प्रीफेच के साथ केवल 1% स्पीडअप प्राप्त करने के बारे में भी बात करते हैं। मुख्य स्मृति में मौजूद डेटा की यादृच्छिक पहुंच के लिए prefetch चमत्कार क्यों काम नहीं करता है?
आधुनिक CPUs पर स्वचालित प्रीफ़ेच को हरा करना मुश्किल है (ए) आपके पास असामान्य/अनुमानित पहुंच पैटर्न है, (बी) आप * वास्तव में * जानते हैं कि आप क्या कर रहे हैं, (सी) आप विशिष्ट CPUs के लिए ट्यून करने के लिए तैयार हैं और (डी) आपके पास मेमोरी बैंडविड्थ को छोड़ने के लिए है। –
हम्मम्म, लेकिन ग्राफ के बारे में क्या? वह अभी भी 1000 चक्र/तत्व कैसे प्राप्त करता है यदि वह प्रोसेसर को बता रहा है कि वह किस पते को अगले पढ़ने के लिए जा रहा है? ऐसा लगता है कि स्थिर स्थिति में वह कामकाजी सेट आकार के बावजूद 200 चक्र/नोड से नीचे नीचे होना चाहिए। सभी fetching तब होना चाहिए जब वह प्रत्येक नोड पर काम कर रहा है। मुझे पता है कि मेरा मानसिक मॉडल बहुत बाहर निकलना होगा, बस यह सुनिश्चित न करें कि क्या। – Philip
@ फिलिप नो, क्योंकि आपका डेटासेट बड़ा हो जाता है, इसलिए आप बहुत कम कैश हिट के साथ मुख्य मेमोरी से प्रीफेचिंग करेंगे। छोटे काम सेट शायद पूरी तरह से कैश में रहते हैं। – Anycorn