2014-09-03 7 views
8

मैंने हमेशा सोचा है कि पूर्वानुमान डेटा कहां/कैसे संग्रहीत किया जाता है? क्या कोई सीमा है? क्या यह केवल हाल ही की शाखा है? मैं ज्यादातर इंटेल आर्किटेक्चर के बारे में चिंतित हूं, लेकिन किसी भी वास्तुकला के बारे में मैं कुछ भी सीख सकता हूं।शाखा भविष्यवाणी डेटा कहां/कैसे संग्रहीत किया जाता है?

उत्तर

5

प्रोसेसर में कहीं आंतरिक रूप से। वास्तव में क्या किया जाता है प्रोसेसर पर निर्भर करता है।

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

लाभ यह है कि यह बहुत सस्ता है। नुकसान यह है कि दो शाखाएं बिल्कुल 4096 बाइट्स अलग-अलग तालिका में एक ही प्रविष्टि का उपयोग करती हैं। तो यदि आपका कोड हर बार इन दो शाखाओं को निष्पादित करता है, और हमेशा एक लिया जाता है और कोई कभी नहीं लिया जाता है, तो शाखा भविष्यवाणी काफी खराब होती है।

कुछ प्रोसेसर प्रति शाखा दो बिट्स का उपयोग करते हैं जिसका अर्थ है "मजबूत लिया गया", "लिया गया", "नहीं लिया गया", "मजबूत नहीं लिया गया"। हर बार जब शाखा को भविष्यवाणी की जाती है तो "मजबूत उठाया जाता है" की ओर बढ़ता है, यदि शाखा नहीं ली जाती है तो यह "मजबूत नहीं" की ओर बढ़ती है। यदि शाखाओं को आम तौर पर दुर्लभ अपवादों के साथ लिया जाता है तो यह बेहतर काम करता है।

कुछ प्रोसेसर शाखा पते के अंतिम 12 या अधिक बिट्स का उपयोग नहीं करते हैं, लेकिन वे कहते हैं कि आखिरी चार शाखाएं ली गई हैं या नहीं। मान लें कि आपके पास कोड

if (x >= 0) { ... } 
if (x <= 0) { ... } 

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

आपको हमेशा समस्या है कि शाखा पूर्वानुमान तालिका में एक ही प्रविष्टि का उपयोग एक से अधिक शाखाओं के लिए किया जाएगा; आप बस इसके साथ रहते हैं। (इसे संभालने के लिए कुछ भी चालाक करने से बहुत अधिक भंडारण होगा। हम प्रति शाखा भविष्यवाणी 1 या 2 बिट का उपयोग कर रहे हैं ताकि हमारे पास बहुत कम भंडारण के साथ भारी टेबल हो)।

+0

मैं सोच रहा था कि वे इसे कोड में ऑपोड में कुछ अप्रयुक्त बिट्स में क्यों नहीं चिपकते हैं। मान लीजिए कि यह धीमी गति से धीमी होगी क्योंकि इसे राम पर वापस जाना होगा। – johnnycrash

+0

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

+0

@Leeor चूंकि यह केवल एक संकेत होगा, एक स्व-संशोधित कोड समस्या नहीं होगी। (इसके अलावा, फ्रंट एंड संशोधन कर रहा होगा।) यदि कोई प्रोग्राम/थ्रेड कोड चला रहे थे तो एक समस्या होगी, इस मामले में एक आईकैच रीफिल किसी अन्य थ्रेड के इतिहास से भविष्यवाणी कर सकता है। यह भी लिखने के लिए और गंदे कैश ब्लॉक का मतलब होगा। –

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