नए सी ++ 11 संरेखण उपकरण का उपयोग करके मैं यह सुनिश्चित करना चाहता था कि एक कैश लाइन में अस्थायी (स्टैक) चर का एक सेट झूठ बोले। मेरा पहला निष्पक्ष प्रयास निम्नानुसार था:कैश-गठबंधन स्टैक चर
int main() {
alignas(64) int a; // 0x7fffc58aac80, properly aligned at 64
int b; // 0x7fffc58aac7c
int c; // 0x7fffc58aac78
return 0;
}
मुझे बेवकूफ़ बनाओ! स्टैक इस तरह चर को आवंटित नहीं करता है, इस प्रकार a
b
और c
से अलग कैश लाइन पर होगा।
क्या इसका मतलब यह है कि कई चरों को सही ढंग से संरेखित करने का एकमात्र तरीका कुल के माध्यम से है?
struct alignas(64) Abc {
int x;
int y;
int z;
};
int main() {
Abc foo;
// x 0x7fff40c2d3c0 (aligned at 64)
// y 0x7fff40c2d3c4
// z 0x7fff40c2d3c8
return 0;
}
संकलक: बजना 3.2
क्या आप वास्तव में सोचते हैं कि एक ही कैश लाइन में इन सभी चरों को प्रदर्शन में सुधार करने जा रहा है? बाधाएं बहुत अच्छी हैं कि ढेर कैश में है। –
यह * प्रभाव हो सकता है यदि इन चरों को एकाधिक कोरों के बीच साझा करने की आवश्यकता है, जैसे कि जो भी कोर इन्हें लिखना चाहता है, उसे एक समय में सभी तीन चर का उपयोग करने की आवश्यकता है। यदि वे सभी एक ही कैश लाइन में हैं और इन चरों तक पहुंच दुर्लभ हैं, तो सहारे यातायात कम हो जाएगा। हालांकि इस बात की कोई गारंटी नहीं है कि लाइन को उसी पंक्ति में दो चर पढ़ने के बीच अमान्य किया जा सकता है। –
आधुनिक संकलन एक निश्चित स्थान पर स्टैक वैरिएबल भी नहीं रखते हैं (जब तक आप अपना पता नहीं लेते)। इसलिए यदि 'ए' और' बी 'ने कैश लाइन साझा की है, तो किसी एक को लिखने के बाद जो बदल सकता है। (यह स्टेटिक सिंगल असाइनमेंट इष्टतमरण के लिए विशिष्ट है) – MSalters