 بسم اللہ الرحمن الرحیم آج ہم موڈیول 134 دسکس کریں گے موڈیول 134 ہے about memory architecture and memory barriers پیویسلی ہم نے ولیٹائل کوالیفائر کے بارے میں دسکشن کی تھی کہ ولیٹائل کوالیفائر جو ہے وہ آپ تب استمال کرتے ہیں جب آپ نے کوئی ایسا شید ویریبل جو number of threads کے بیچ میں شیر ہو رہے number of threads جس کو موڈیفائر کرنے کی کوشش کر رہے ہیں تو اس کے آپ اس کو ولیٹائل بنا دیتے ہیں ولیٹائل اس لی بنا دیتے ہیں تاکہ جب سوچنگ ہو تو اس سوچنگ کے دوران وہ ویریبل اس کی intermediate value register میں نہ پڑی رہا جاتی ہیں اور واپس memory کے اوپر right back نہیں ہوتی to make sure کہ جو بھی موڈیفکیشن ہوتی ہے وہ memory کے اوپر right back ہو اور اسی instance پر right back ہو اور memory میں رتے بھی کوشش کیجائے کہ اس کے پر operations کیے جائے اس لیے اس کو ولیٹائل بنائے جاتا ہے ایسا کرنے سے performance ڈیکریڈ ہو جاتی ہے لیکن of course ہمیں result accurate چاہی ہیں تو اس کس کے اندر conflicts جو ہیں ان کے آنے کے چانسیں جو ہیں وہ reduce ہو جاتے ہیں لیکن پھر بھی صرف ولیٹائل بنان دینہ کافی نہیں ہیں جب آج کل کے جو modern processors ہیں اس کے اندر multi level cash use ہوتی ہے level 1 cash level 2 cash جب بھی کوئی variable ایک processor get کرتا تو ہو سکتا وہ variable cash میں سے get کر رہو اور جب اس کو modify اس نے کیا تو ہو سکتا ہے صرف وہ variable cash کے اندر modify ہوا memory میں کب جا کہ اس نے write ہونے وہ جو cash کو حنل کرنے کے لیے جو policies ہیں ان سے پتہ چلتا ہے وہ decided کرتی ہیں کہ کب cash کے اندر proud variable جو ہے واپس memory میں جائے گا جب تک وہ memory میں جائے گا وہ کسی دوسرے processor کو accessible نہیں ہوگا کیونکہ cash جو ہوتا ہے وہ ابھی ہم جس طرح اسے ایک example کی مدل سے ایک diagram کی مدل سے understand کرنے کی کوشش کرنے گے cash ہو سکتا ہے کہ ہر processor کے لیے اپنی private ہو ہر processor کی اپنی cash ہوگی جب ایک cash کے اندر modification ہوئی ہے تو اس کا مطلب یہ نہیں کہ باکی cash اس کے اندر بھی modification ہوگا تو یہ مالی problem جو ہے یہ cash کوہرنسی کی problem کے لاتی ہے تو کس sequence کے اندر memory کے اندر modification ہوگی اگر آپ ایک variable کو change کرتے ہیں اسی وقت ہی main memory کے اندر اس کے اندر change نہیں آتا اسی وقت جو change آتا ہے وہ cash کے اندر آتا ہے کس وقت جاکے وہ change memory میں جاکے reflect ہوگا وہ آپ determine نہیں کر سکتے ہو سکتا اسی وقت ہو جائے ہو سکتا ہے کافی دیر بعد جاکے وہ change memory کیوں پر reflect ہو تو ہمیں یہاں پہ کیونکہ ہم چاہتے ہیں وہ memory کیوں پر reflect ہو اور اس کا effect باکی processors کیوں پر بھی نظر آئے ایک cash کے اندر variable change ہوگا اگر دوسی cash کے اندر وہ variable change ہوگا یا دوسی cash کے اندر وہ accessible نہیں ہے دوسرے processor کے اندر وہ accessible نہیں ہے تو یہ cash کو ہرنسی کی problem کے لاتی ہے اس problem کو ہم کسی طرح سے دیکھیں گے rectify کیسے کر سکتے ہیں اس کے لیے windows آپ کو provide کرتی ہے memory barriers memory barriers وہ assure کرتے ہیں کہ جو just desired order کے اندر آپ memory کو access کرنا چاہر ہیں اسی desired order کے اندر memory access ہو memory barriers آپ enforce کرتے ہیں using some inter logged function آگے چلکے ہم ایک example دیکھیں گے اس کے اندر inter logged function کہ ہم استعمال کریں گے تو کوئی inter logged function use کی مدل سے آپ memory barriers جو ہے ان کو enforce کرتے ہیں آگے ایک اور diagram ہے اس کی مدل سے probably آپ زیادہ بہتر تریکہ سے understand کر سکتے ہیں کہ ادھر memory barriers کا کیا role ہے اور یہ اصل problem ہے کیا اس diagram کے اندر آپ دیکھ سکتے ہیں کہ یہ ویسے تو ایک processor ہے اور اس کے اندر 4 cores ہیں 1,0,1,2,3 4 cores ہے اور dual chip processor dual chip processor دو اس کے اندر chip ہے ہر چپ کے اندر ایک چپ کے اندر 2 cores ہے ایک چپ کے اندر چپ 0 کے اندر core 0 ہے اور core 1 اور چپ 1 کے اندر core 2 ہے اور core 3 ہے جو آپ دیکھ سکتے ہیں ہر core کیلئے کاش کی سچوشن ہے ایک level 1 کاش ہے level 1 کاش جو ہوتی ہے وہ سائیز میں کم ہوتی ہے لیکن فاستر ہوتی ہے بہت زیادہ فاستر ہوتی ہے اگر level 1 کاش کو ہوسکتا ہے کہ ایکسس کرنے میں 3 clock cycles لگریں تو ہوسکتا ہے level 2 کاش کو ایکسس کرنے میں 14 clock cycles لگیں اور memory کو ایکسس کرنے میں hundreds of clock cycles لگیں 100 plus clock cycles لگیں تو core 0 کو جو کاش اویلے بل ہے وہ یہ بلی کاش ہے l1 کاش اور core 1 کی l1 کاش الگ ہے core 2 کی l1 کاش الگ ہے core 3 کی level 1 کاش الگ ہے ہر ایک اپنی اپنی private کاش ہے کوئی ایک کاش کر کیونکہ میکنزمی اس طرح ہے کہ اگر کاش چھوٹی ہوگی تو وہ فاستر ہوگی جتنی بڑی کرتے جائیں گے اتنی سلور کرتے جائیں گے تو ایک بہت بڑی کاش رکھنا جس کو کہ سارے پراسیسز اقسیس کر سکیں لہذا ایک چھوٹی چھوٹی کاش ہر پراسیسر کی الگ لگ l1 کاش ہے اور l2 کاش کا تھوڑا سائیز بڑھا تو یہ l2 کاش کو اپتماریز کرنے کے لئے l2 کاش جو ہے اس کو اقسیس کرنے میں تھوڑا زیادہ time لگ رہا ہے لیکن اس کا سائیز بڑھا تو یہ core 0 اور core 1 دونوں l2 کاش کو اقسیس کر سکتی ہیں یہ l2 کاش جو ہے core 0 اور 1 کے لئے اپنی private اور 2 اور 3 کے لئے الگ سے l2 کاش ہے اگر l2 کاش کے اندر ایک верیبل پڑا ہو گا core 0 اور 1 کی then core 2 اور 3 کو ایکسس نہیں ہوگا اسے نا سے کسی بھی core کی l1 کاش کے اندر sometimes書ٹر تو وہ کسی آر core کو ایکسیس Spongeحوں نہیں ہوگا say core 0 جو ہے core 0 کی اسout 21ساکٹر کو يہ گے ویریبل پڑاو ہے جو بھی اتر ویریبل پڑاو ہے وہ کور 1 کو ایکسس نہیں ہوسکتا ہے کیونکہ وہ یہاں پہ ہے اور اس کی کاش علاگ ہے اس کی کور 2 کیا کاش علاگ ہے اور کور 3 کی کاش علاگ ہے تو ہمارا جو problem ہے وہ problem یہ ہے کہ اس کور نے اگر ایک ویریبل کو چیج کیا اس نے ایک ویریبل کو رائٹ کیا اور رائٹ کیا جب رائٹ کیا تو وہ ویریبل L1 کاش کے اندر رہا L1 کاش سے وہ میمری میں کب جائے گا ہمیں نہیں پتا تو ہم چاہتے ہیں کہ جب بھی ایدر L1 کاش پر رائٹ ہوتا ہے تو وہ سے کور 3 کو بھی وہ ایکسس ہو جائے لیکن کور 3 کی L1 کاش دفرنت ہے کور 3 کو وہ ایکسس نہیں ہوگا اگر کور 3 کو ایکسس ہوگا تو وہ میمری کے ثوروہ ایکسس ہوگا اور میمری میں یہ ویریبل کب آئے گا ہمیں نہیں پتا تو میمری باریلزی انشور کرتے ہیں کہ جب بھی آپ کسی ایک ویریبل کے پر کو ویریبل رائٹ کرتے ہیں تو وہ ساتھ ہی ساتھ میمری کے اندر اپڑیٹ ہو جائے اسی انسٹنس پر میمری کے اندر اپڑیٹ ہو جائے نورمل جو اپٹمائیسٹ ورکنگ ہے اس ورکنگ کے اندر کب جاکے وہ میمری کے اندر اپڑیٹ ہوگا کبھی ہو سکتا ہے جلدی ہو سکتا ہے کبھی ہو سکتا ہے کافی دیر بعد ہو We don't know وہ جو انجوو سکتا ہے جو اکسیوکشن امی HARکیشن کرتی ہے دویڈنگ دا اکسیوکشن امن پلا چلتا ہے کہ کب جاکے اسنے عبتڈ ہونا ہے لیکن میمری باریلز انشور کرتے ہیں اگر آپ کسی ایک ویریبل کے ساتھ میمری باریلز رہےہاٹ کرتے ہیں تو وہ یہ اشور کریں کہ جو ہی آپ ویریبل کے اپر کوئی چینج کرتے ہیں ساتھ ہی ساتھ وہ میمری کے اندر جو ہی اپڑیٹ ہو جائے جو ہی میمری کے اندر اپڑیٹ ہوتا تو اب میمری کے ثور کور 3 بھی جو ہے وہ اس کو ایکسس کر سکتی ہے تو یہی پوئنٹ امفیسس کرنے کے ذو تا ہے کہ جو ولیٹائل ہے ولیٹائل صرف یہ اشہور کرتا ہے کہ جو آپ نے نئی ویلیوز اسائن کیا ہے اپنے کسی دیتا کو وہ ویلیوز جو ہے ایل ون کش کے اندر اپڑیٹ ہو گئے وہ یہ اشہور نہیں کرتا کہ وہ ویلیوز پرپوگیٹ ہوئی ہے اپتو میمری اور میمری کے تھرو وہ اب باکی کوز کو بھی ایکسیس بل ہوگئے ہم نے وہ ویلیو باکی کوز کو بھی ایکسیس بل بنانی ہے تاکہ دوسری تھریٹ جو ہے وہ بھی ایکسس کر سکیں اگر صرف ال ون کش کے اندر جین جاتا ہے تو باکی جو تھریٹ اگر سے ایک کور 3 کیو پر تھریٹ چل رہی ہے وہ اپنی ال ون کش کو ایکسس کرے گی تو اُس کی ال ون کش کے اندر وہ ویلیو جو ہے ابھی پرپوگیٹ نہیں ہوئی ہوگی یہ ہماری کش کوہرنسی کی problem ہے اور اسی problem کا سلوشن جو ہے وہ ہمیں میمری باریرز کے تھرو ملتا تو میمری باریرز یہ انشور کرتے ہیں کہ جب بھی آپ رائیٹ کرتے ہیں کسی ایک ویریبل کے اوپر تو نہ صرف وہ ال ون کش کے اوپر رائیٹ ہو بلکہ وہ پوری طرح سے پروپوگیٹ ہو up to the میمری اور میمری کے تھرو وہ دوسری کوز کو بھی ایکسس بل ہو جائے یا پھر کوئی اور میکنیزم جس کے تھرو دوسری کور جو ہے اس ویریبل یا تو وہ کش میں سے رموگ ہو جائے اور صرف میمری کے اندر ہی آ جائے اور میمری سے پھر ساری کش جو ہے اس کو ایکسس کر سکیں update ہو جائے ساری کش کے اندر یا invalidate ہو جائے ساری کش کے اندر کوئی بھی میکنیزم جس کے تھرو وہ across the board ویریبل جو بھی اس کی updated value ہے سارے کے سارے processor کو accessible ہوئے تو اسی کے اندر for example جیسے ہمار پر سکر ایک ویریبل ہے n اور وہ n ویریبل ہماری ایک thread run ہو رہی ہے وہ thread core 0 پر run ہو رہی ہے core 0 جو ہے اس n ویریبل کو increment کرتی ہے جب increment کرتی ہے تو جو change ہے وہ کہاں پر آئے گی l1 cash پر آئے گی آپ کا volatile کا جو qualifier وہ انشور کرے کے وہ instantaneously جو بھی change کیا ہے وہ l1 cash کے اوپر آجے اب جو l1 cash کے اوپر change آئی ہے وہ change core 3 کو accessible نہیں ہے core 3 کے اوپر کو دوسری thread run کری ہے جس نے اسی n ویریبل کو use کرنا ہے اگلہ جو اس کا increment core 3 پر run ہونے والی thread نے اس کے اندر increment performance کرنا لیکن core 3 کے l1 cash کے اندر وہ ویریبل ابھی تک update نہیں ہوا ہو سکتا پڑا لیکن پھر اگر پڑا بھی ہو اس کی پرانی value ہوگی ہو سکتا ہے پڑھا ہی نہ ہو تو اب وہ ویریبل کہاں سے آئے گا تو ہمارا یہ جو memory barrier ہے یہ انشور کرے گا جب n کو core 0 نے update کیا تو وہ value جا کے memory کے اندر بھی propagate ہو اور جب memory کے اندر propagate ہو تو core 3 بھی اس کو memory سے updated value کو access کریں core 3 کی memory میں سے بھی یا تو وہ invalidate ہو جائے یا memory میں سے وہ access ہو اچھا اب آپ اس کے اندر دیکھ سکتے ہیں کہ جو memory barriers ان کی cost is very high اگر l1 میں سے ایک ویریبل نے access ہونا تھا 3 clock cycles consume ہونے تھے اگر l2 میں سے ایک ویریبل نے access ہونا تھا تو 14 clock cycles ہونے تھے اور اگر memory میں سے کوئی ایک ویریبل access ہوتا تو 100 plus clock cycles memory barrier enforce کتا ہے کہ جب بھی ایک ویریبل کے اندر کوئی چینج ہوئی ہے تو وہ سیدہ memory کے اندر جب memory کے اندر right ہوگا تو آپ کے 100 plus clock cycles consume ہون گے اور جب دوسی core بھی اس کو memory میں سے access کرے گی تو again 100 plus clock cycles consume ہون گے تو اس طرح سے یہ ایک expensive task ہے اگر آپ نے memory barriers کے استعمال کرنا تو بہت كیرفلی کرنا اس طرح سے کرنا کہ صرف وہی variables memory barrier کے through update ہو جو کہ shared ہے ہر ویریبل کو آپ نے memory barrier کے through update نہیں کرنا کیونکہ یہ of course آپ کی performance ہے overall اگر ہر ویریبل memory barrier کے through access ہوگا تو پورے program کے performance جو وہ بری طرح سے degrade ہو جائے گی