अंतिम अद्यतन:2026-10-12
C++ False Sharing और cache line¶
हाल में एक code देखा जिसमें alignment manually की गई थी, तो अध्ययन करते हैं कि alignment न करने पर क्या असर पड़ता है?
template <typename T>
class AtomicWithPadding {
private:
static constexpr int kCacheLineSize = 64;
uint8_t padding_before[kCacheLineSize];
public:
std::atomic<T> value;
private:
uint8_t padding_after[kCacheLineSize];
};
यहाँ सबके interviews का ज़रूरी topic आ जाता है:
- Cache line
इसके आधार पर नीचे कुछ interview प्रश्न दिए हैं, क्या आप उत्तर दे सकते हैं?
- Cache line क्या है?
- MESI protocol क्या है?
- False sharing क्या है?
- C++ में False sharing से बचना कैसे सुनिश्चित करें?
- False sharing से बचने के क्या फ़ायदे हैं?
- क्या आप जानते हैं C++17 के बाद इस समस्या को हल करने के लिए कौन से दो variables दिए गए हैं?
इसके बाद, एक performance test ढूंढा, जिसका implementation मोटे तौर पर ऐसा है:
- 4 variables define करें, a, b, c, d, जिन्हें multiple threads share करते हैं
- दूसरा, इन चार variables को align करें, फिर n threads खोलकर schedule करें।
नीचे benchmark है:
------------------------------------------------------------------
Benchmark Time CPU Iterations
------------------------------------------------------------------
singleThread 4.05 ms 4.04 ms 133
directSharing/real_time 8.78 ms 0.069 ms 77
falseSharing/real_time 8.81 ms 0.083 ms 74
noSharing/real_time 1.16 ms 0.071 ms 578
देखा जा सकता है कि noSharing ने बहुत अच्छे परिणाम दिए! Cache hit rate बहुत बढ़ गया, बेशक यहाँ perf से analyze करना और भी बेहतर होगा, L1 cache miss देखे जा सकते हैं।
उपरोक्त उत्तर 知识星球 में अपडेट किए जा चुके हैं, साथ मिलकर चर्चा करने के लिए स्वागत है, comments में बात करें, धन्यवाद~
संबंधित विषय¶
- C++ Concurrency in Action रीडिंग गाइड | C++那些事
- C++ deadlock जांच | C++那些事
- C++ SIMD vectorization | C++那些事
- C++17 parallel STL | C++那些事
- GDB multithread All-Stop डीबगिंग | C++那些事
- Helgrind concurrency error detection | C++那些事
- libev event loop का सिद्धांत | C++那些事
- C++ std::thread kernel implementation | C++那些事
- C++ std::thread और jthread | C++那些事
- C++ multithreading की शुरुआत | C++那些事