پروژه «بهینه‌سازی معکوس پردازنده» برای یافتن کندترین کد ماشین

یک محقق سخت‌افزار با راه‌اندازی پروژه‌ای به نام «بهینه‌سازی معکوس پردازنده»، به دنبال یافتن کندترین دستورالعمل‌های ماشین است تا کدهای با بیشترین تاخیر را شناسایی کند.

تتیم تحریریه۳ دقیقه مطالعه۰ بازدید۱۴۰۵/۵/۱۸
پروژه «بهینه‌سازی معکوس پردازنده» برای یافتن کندترین کد ماشین

برای بهینه‌سازی نحوه اجرای نرم‌افزار روی سخت‌افزار، تحلیل تأخیر دستورالعمل‌ها به بررسی زمان لازم برای اجرای دستورالعمل‌های سطح پایین روی پردازنده می‌پردازد؛ این کار یا برای بهینه‌سازی معماری یا بهینه‌سازی برنامه‌ها برای اجرا روی یک معماری خاص انجام می‌شود. یک محقق سخت‌افزار به نام کریستوفر دوماس (Christopher Domas) با نام کاربری (@xoreaxeaxeax) در گیت‌هاب (GitHub)، رویکرد متفاوتی را با جدول امتیازات «بهینه‌سازی معکوس پردازنده» (CPU Deoptimization) در پیش گرفته است. هدف این پروژه این نیست که دستورالعمل‌های اسمبلی (Assembly) را تا حد امکان سریع اجرا کند، بلکه می‌خواهد آن‌ها را تا جای ممکن کندسازد تا بتواند تک‌دستورالعملی با بیشترین تأخیر را اندازه‌گیری کند.

برنده این بخش دستورالعمل fxrstor64 است که اجرای آن ۶۲ ثانیه یا بیش از ۱۹۸ میلیارد سیکل طول کشید. این دستورالعمل وضعیت رجیسترهای مورد استفاده برای محاسبات سیمد (SIMD) را به یک مکان حافظه ۵۱۲ بایتی بازیابی می‌کند. برای دستیابی به بالاترین (کندترین) امتیاز، دوماس ابتدا از ابزار شخصی خود به نام mmiotic برای یافتن یک ناحیه با تأخیر بالا در ساختار داخلی پای‌سی‌ال‌ئی (PCIe) استفاده کرد و سپس پردازنده را مجبور ساخت تا یک حالت ۵۱۲ بایتی را از ممایو (MMIO یا Memory-Mapped I/O) بارگذاری کند و عملاً تمام آن ۵۱۲ بایت را با کندترین سرعت ممکن پردازش نماید. این کار ۷۴ میلیارد سیکل یا کمی بیش از ۲۳ ثانیه زمان برد.

سپس، او با «محروم کردن ساختار در حین انجام بارگذاری» قدم را فراتر گذاشت. او این کار را با استفاده از مجموعه‌ای از خوانش‌های ۴ بایتی از یک رجیستر دیگر ممایو (MMIO) با تأخیر بالا انجام داد، که باعث شد مجتمع ریشه پای‌سی‌ال‌ئی (PCIe root complex) پردازنده تحت فشار قرار گیرد و بازیابی وضعیت مجبور شود در صف عملیات خوانش غیرضروری قرار گیرد. گام بعدی استفاده از دستورالعمل‌های آام‌اکس (AMX) موجود در پردازنده‌های سافایر رپیدز (Sapphire Rapids) اینتل برای xrstore64 است. ناحیه وضعیت از ۵۱۲ بایت به ۸ کیلوبایت افزایش می‌یابد که می‌تواند باعث شود دستورالعمل برای بیش از ۱ تریلیون سیکل متوقف شود.

جدول امتیازات معماری x86 هم‌اکنون روی گیت‌هاب (GitHub) در دسترس است و به نظر می‌رسد دوماس جدول امتیازات آرم (ARM) و ریسک-وی (RISC-V) را نیز در برنامه دارد. چند قانون برای این رکوردهای ثبت‌شده وجود دارد. دوماس می‌گوید هر تنظیمی قابل قبول است، به شرطی که تنها اجرای یک دستورالعمل امتیازدهی شود. دستورالعمل‌های قابل وقفه مجاز نیستند و همچنین امتیازدهی به دستورالعمل‌های شبیه‌سازی‌شده که روی کنترل‌کننده اجرا می‌شوند پذیرفته نیست. تمامی زمان‌ها بر اساس ساعت پایه پردازنده نرمال‌سازی شده‌اند و پلتفرم‌ها همگی بدون تغییرات سخت‌افزاری اجرا شده‌اند.

از آنجا که ما با کد اسمبلی سروکار داریم، رتبه‌بندی کمتر به دستورالعمل خاص مربوط می‌شود و بیشتر به کاری که با آن دستورالعمل انجام می‌دهید وابستگی دارد.

دوماس در درجه اول از دو پردازنده برای آزمایش استفاده کرد: اینتل کور آی۷-۸۵۵۹یو (Intel Core i7-8559U) و ای‌ام‌دی رایزن ۷ ۵۸۰۰اچ (AMD Ryzen 7 5800H) (که درون رایانه Trigkey S5 قرار داشت). با این حال، برای دستورالعمل rdmsr، او از یک تراشه ویا ادن (VIA Eden) استفاده کرد که سری پردازنده‌های توکار از اوایل دهه ۲۰۰۰ بودند. فرمان rdmsr برای خواندن یک رجیستر خاص مدل یا همان MSR استفاده می‌شود. به گفته دوماس، شرکت ویا (VIA) «از یک رجیستر مستندنشده در آدرس 0x133 استفاده می‌کند که زمان پاسخ‌دهی فوق‌العاده بالایی دارد.» اجرای آن فرمان ۲۰۲ میکروثانیه یا ۱۶۱,۶۰۲ سیکل زمان برد.

این اولین تجربه این توسعه‌دهنده در زمینه آزمایش‌های عجیب روی دستورالعمل‌های سطح پایین نیست. یک پروژه قبلی به نام movfuscator، یک کامپایلر زبان سی (C) است که صرفاً از دستور mov (مخفف move) استفاده می‌کند.

نظرات۰

برای نوشتن نظر، وارد حساب خود شوید.

ورود / ثبت‌نام

هنوز نظری ثبت نشده — اولین نفری باش که نظر می‌دهد.