False Sharing
ফলস শেয়ারিং
দুইটা ভিন্ন, স্বাধীন variable ভিন্ন থ্রেড থেকে লেখা হচ্ছে, কিন্তু কাকতালীয়ভাবে একই ৬৪-বাইট cache line-এ পড়ে থাকায় coherence protocol তাদের একটাই resource ভেবে বারবার line ping-pong করায়।
also: cache line ping-pong, cache-line contention
True sharing-এ দুই thread সত্যিই একই variable ছোঁয় (race condition-এর ঝুঁকি)। False sharing-এ কোনো logical dependency নেই — শুধু [[cache-line]] গ্রানুলারিটির কারণে hardware দুইটা আলাদা করতে পারে না।
struct { long a; long b; } shared; /* একই line-এ, thread 0 → a, thread 1 → b */
প্রতিটা write একটা cross-core RFO (Read-For-Ownership) ট্রিগার করে — [[cache-coherence-mesi|MESI]]-র M→I→M চক্র, কয়েক দশ-শ cycle প্রতিটায়। বাস্তব benchmark-এ ১০ গুণের বেশি slowdown সাধারণ, কোনো algorithm বদল ছাড়াই।
সমাধান: padding বা alignas(64) দিয়ে variable-দুটোকে
আলাদা line-এ পাঠানো। C++17: std::hardware_destructive_interference_size।
সনাক্তকরণ: perf c2c record/report — সরাসরি HITM
(Hit-Modified) count দেখায়, কোন line-এ ping-pong হচ্ছে।
Correctness-এর সমস্যা না, শুধু performance — কিন্তু সমাধান প্রায় বিনামূল্যে (কয়েক বাইট memory), যেখানে race condition-এর সমাধান algorithm redesign দাবি করতে পারে।