Foundationপ্রথম নীতি থেকে
LEVEL 11 · Advanced Architecture & Performance

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 দাবি করতে পারে।