मैंने हाल ही में अपने आवेदन में झूठी साझा करने वाली समस्या का सामना किया है, और मैंने Sutter's article को कैश लाइनों पर अपने डेटा को संरेखित करने के तरीके पर देखा है। वह निम्नलिखित सी ++ कोड पता चलता है:कैश लाइन संरेखण (आलेख पर स्पष्टीकरण की आवश्यकता है)
// C++ (using C++0x alignment syntax)
template<typename T>
struct cache_line_storage {
[[ align(CACHE_LINE_SIZE) ]] T data;
char pad[ CACHE_LINE_SIZE > sizeof(T)
? CACHE_LINE_SIZE - sizeof(T)
: 1 ];
};
मैं यह कैसे काम करेगा जब CACHE_LINE_SIZE > sizeof(T)
सच है देख सकते हैं - struct cache_line_storage
सिर्फ स्मृति में से एक पूर्ण कैश लाइन को ले जा रही समाप्त होता है। हालांकि, जब sizeof(T)
एक कैश लाइन से बड़ा होता है, तो मुझे लगता है कि हमें CACHE_LINE_SIZE - T % CACHE_LINE_SIZE
बाइट्स द्वारा डेटा पैड करना चाहिए, ताकि परिणामस्वरूप संरचना का आकार हो जो कैश लाइन आकार का एक अभिन्न अंग है। मेरी समझ में क्या गलत है? 1 बाइट के साथ पैडिंग पर्याप्त क्यों है?
+1, हालांकि व्यवहार में, मुझे किसी भी मामले से अवगत नहीं है जहां संरचना संरेखण कैशलाइन आकार से अधिक हो सकता है। सभी प्रकार के संरेखण बाधाओं के बाद आम तौर पर कैशलाइन बाधाओं से आते हैं। – Bahbar
क्या आपके सुझाव में संरचना या संरचना के पहले तत्व पर लागू संरेखण है? –
लेकिन झूठी-साझाकरण के मैकेनिक्स के लिए .. इसे रोकने के लिए, 't' को कैश लाइन आकार के अभिन्न एकाधिक से गठबंधन नहीं किया जाना चाहिए, भले ही' sizeof (T)> CACHE_LINE_SIZE'? या यह आवश्यक नहीं है? – int3