برای بهینهسازی نحوه اجرای نرمافزار روی سختافزار، تحلیل تأخیر دستورالعملها به بررسی زمان لازم برای اجرای دستورالعملهای سطح پایین روی پردازنده میپردازد؛ این کار یا برای بهینهسازی معماری و یا بهینهسازی برنامهها برای اجرا روی یک معماری خاص انجام میشود. کریستوفر دوماس (Christopher Domas) با نام کاربری xoreaxeaxeax روی گیتهاب (GitHub)، رویکرد متفاوتی را با جدول امتیازی «بهینهسازیمنفی پردازنده» (CPU Deoptimization) در پیش گرفته است. هدف این پروژه نه سرعت بخشیدن به دستورالعملهای اسمبلی، بلکه کند کردن هرچه بیشتر آنها برای اندازهگیری تکدستورالعملی است که بیشترین تأخیر را دارد.
برنده این بخش دستورالعمل fxrstor64 است که تکمیل آن ۶۲ ثانیه یا بیش از ۱۹۸ میلیارد چرخه طول کشید. این دستورالعمل وضعیت رجیسترهای مورد استفاده برای محاسبات SIMD را به یک مکان حافظه ۵۱۲ بایتی بازمیگرداند. برای دستیابی به بالاترین (کندترین) امتیاز، دوماس ابتدا از ابزار شخصی خود یعنی mmiotic برای یافتن یک ناحیه با تأخیر بالا در ساختار داخلی PCIe استفاده کرد، سپس پردازنده را مجبور نمود تا یک وضعیت ۵۱۲ بایتی را از MMIO (ورودی/خروجی نگاشتشده در حافظه) بارگذاری کند و عملاً تمام آن ۵۱۲ بایت را با کمترین سرعت ممکن پردازش نماید. این کار ۷۴ میلیارد چرخه یا کمی بیش از ۲۳ ثانیه طول کشید.
سپس او با «گرسنه نگه داشتن ساختار (Fabric) در حین بارگذاری»، گام را فراتر گذاشت. او این کار را با استفاده از مجموعهای از خوانشهای ۴ بایتی از یک رجیستر دیگر MMIO با تأخیر بالا انجام داد که باعث شد مجموعه ریشه PCIe پردازنده زیر فشار برود و دستورالعمل بازگردانی وضعیت مجبور شود در صف عملیات خواندن بیفایده منتظر بماند. گام بعدی استفاده از دستورالعملهای AMX موجود در پردازندههای سافایر رپیدز (Sapphire Rapids) اینتل (Intel) برای دستور xrstore64 است. ناحیه وضعیت از ۵۱۲ بایت به ۸ کیلوبایت افزایش مییابد که میتواند باعث توقف دستورالعمل برای بیش از ۱ تریلیون چرخه شود.
جدول امتیازی x86 اکنون روی گیتهاب فعال است و به نظر میرسد دوماس برنامههایی برای ایجاد جدولهای امتیازی ARM و RISC-V نیز دارد. چند قانون برای این اجراها وجود دارد. دوماس میگوید هر ستآپ و تنظیمی قابل قبول است، به شرطی که تنها اجرای یک دستورالعمل امتیازدهی شود. دستورالعملهای قابل وقفه مجاز نیستند و همچنین امتیازدهی به دستورالعملهای شبیهسازیشدهای که روی هندلر اجرا میشوند نیز مجاز نیست. تمام زمانها بر اساس ساعت پایه پردازنده نرمالسازی شدهاند و پلتفرمها همگی بدون هیچگونه تغییر سختافزاری اجرا شدهاند.
ما در اینجا با کد اسمبلی سر و کار داریم، بنابراین رتبهبندی کمتر مربوط به دستورالعمل خاص است و بیشتر به کاری مربوط میشود که با آن دستورالعمل انجام میدهید.
دوماس عمدتاً از دو پردازنده برای آزمایش استفاده کرد: اینتل کور i7-8559U (Intel Core i7-8559U) و ایامدی رایزن ۷ 5800H (AMD Ryzen 7 5800H) (داخل تریگکی اس۵ (Trigkey S5)). با این حال، برای دستور rdmsr، او از یک تراشه ویا ادن (VIA Eden) استفاده کرد که سری پردازندههای توکار از اوایل دهه ۲۰۰۰ بودند. فرمان rdmsr برای خواندن یک رجیستر خاص مدل یا MSR استفاده میشود. به گفته دوماس، شرکت ویا (VIA) «از یک رجیستر مستندنشده در آدرس 0x133 استفاده میکند که زمان پاسخگویی فوقالعاده بالایی دارد.» اجرای آن فرمان ۲۰۰ میکروثانیه یا ۱۶۱,۶۰۲ چرخه طول کشید.
این نخستین تجربه این توسعهدهنده در آزمایشهای عجیب روی دستورالعملهای سطح پایین نیست. پروژه قبلی او به نام movfuscator یک کامپایلر C است که صرفاً از فرمان mov (حرکت دادن) استفاده میکند.
