عملیات store مستقیماً به cache نمیرود؛ ابتدا در store buffer قرار میگیرد، چون انتظار برای تکمیل نوشتن، پردازنده را متوقف میکند. یک load بعدی میتواند داده را از همین buffer بگیرد؛ این سازوکار store forwarding نام دارد. اما اندازه و محدودهٔ دسترسی تعیین میکنند که این مسیر قابل استفاده باشد یا نه.
طبق مقاله، store forwarding زمانی کار میکند که load هماندازهٔ store باشد، یا کوچکتر باشد و کاملاً داخل محدودهٔ آن قرار بگیرد. اگر load بزرگتر باشد یا دو محدوده فقط بخشی از یکدیگر را بپوشانند، این سازوکار شکست میخورد و load باید منتظر رسیدن store به cache بماند.
نمونهٔ مقاله در C ابتدا با memcpy یک byte را در buffer بازنویسی میکند و سپس با memcpy هشت byte را از همان آدرس میخواند. این الگو معمولاً باعث شکست store forwarding میشود. نوشتن چهار byte و سپس خواندن هشت byte نیز همین مسئله را دارد. حتی نوشتن و خواندن هشت byte هم اگر خواندن از چهار byte جلوتر آغاز شود، بهدلیل همپوشانی ناقص مشکلساز است.
راه جایگزینِ نشاندادهشده، انجام تغییر در register است: ابتدا هشت byte خوانده میشود، مقدار با عملیات بیتی تغییر میکند و سپس نتیجهٔ هشتbyteای نوشته و همان مقدار برگردانده میشود. همچنین اگر همان هشت byte نوشتهشده دوباره خوانده شود، compiler ممکن است خواندن مجدد را حذف کند.
در آزمایشهای نویسنده، الگوی نوشتن و خواندن هشت byte از یک آدرس در Xeon Gold 6548N، Xeon 6975P-C و EPYC 9R45 یک cycle طول کشید. با نوشتن چهار byte و خواندن هشت byte، این عدد در دو Xeon به ۱۹ و در EPYC به ۱۴ رسید. همین الگو در Graviton 5 و Apple M4 Max پنج cycle زمان برد. دو نوشتنِ چهارbyteای پیش از خواندن هشت byte نیز برای Apple M4 Max هشت cycle ثبت کرد. این اندازهگیریها نشان میدهند هزینهٔ الگوهای بررسیشده به پردازنده وابسته است.



