بررسی جزئیات بنچمارک SPEC CPU و نحوه بهینه‌سازی

این مقاله با بررسی دقیق و مهندسی بنچمارک SPEC CPU2017، به ساختار آزمون‌ها، نحوه محاسبه امتیازات و لایه‌های مختلف بهینه‌سازی پردازنده‌ها می‌پردازد. در نهایت نشان می‌دهد که چگونه تیم‌های زیرساخت می‌توانند با استفاده از این استاندارد صنعتی، توان واقعی سخت‌افزار خود را بسنجند.

در مقالات قبلی به بررسی کلیات بنچمارک‌های سخت‌افزاری و اهمیت استاندارد SPEC در ارزیابی عملکرد سیستم‌ها و سرورها پرداختیم. آنجا اشاره کردیم که چرا سازمان‌ها برای سنجش توان واقعی زیرساخت‌های خود به ابزارهایی فراتر از کاتالوگ‌ها نیاز دارند.

حالا می‌خواهیم با نگاهی دقیق‌تر و مهندسی‌تر، وارد جزئیات فنی مجموعه بنچمارک SPEC CPU2017 شویم. بریم با جزییات بیشتر بررسی کنیم و ساختار این آزمون‌ها، منطق محاسبه امتیازات، نحوه اجرای عملی و لایه‌های مختلف بهینه‌سازی را کالبدشکافی کنیم.

معماری و ساختار بنچمارک‌های SPEC CPU2017

مجموعه SPEC CPU2017 شامل ۴۳ بنچمارک مجزا است که بر اساس نرم‌افزارها و کدهای واقعی در دنیای پردازش توسعه یافته‌اند. برای آشنایی بیشتر، در جدول زیر نمونه‌هایی از این بنچمارک‌ها به تفکیک دسته‌بندی و نوع محاسبات آورده شده است:

دسته‌بندی (Suite)نمونه بنچمارک (نسخه Rate / Speed)نوع پردازش و کاربرد
Integer (عدد صحیح)500.perlbench_r / 600.perlbench_sپردازش متن و اجرای اسکریپت (مفسر زبان Perl)
Integer (عدد صحیح)502.gcc_r / 602.gcc_sترجمه کدهای برنامه‌نویسی (کامپایلر C GNU)
Integer (عدد صحیح)505.mcf_r / 605.mcf_sالگوریتم‌های پیچیده شبکه‌ای (برنامه‌ریزی مسیر)
Integer (عدد صحیح)531.deepsjeng_r / 631.deepsjeng_sهوش مصنوعی و درخت تصمیم‌گیری (الگوریتم شطرنج)
Floating Point (اعشاری)503.bwaves_r / 603.bwaves_sشبیه‌سازی‌های فیزیکی (مدل‌سازی موج و انفجار)
Floating Point (اعشاری)519.lbm_r / 619.lbm_sمحاسبات سنگین مهندسی (دینامیک سیالات)
Floating Point (اعشاری)521.wrf_r / 621.wrf_sعلوم زمین و اقلیم‌شناسی (پیش‌بینی وضعیت هوا)
Floating Point (اعشاری)526.blender_rگرافیک کامپیوتری و پردازش تصویر (رندرینگ سه‌بعدی)

این آزمون‌ها برای پوشش دادن انواع بارهای کاری، بر اساس سه معیار اصلی به ۴ دسته تقسیم می‌شوند: نوع محاسبات، نحوه اجرای بار کاری و مدیریت منابع.

نوع محاسبات: اعداد صحیح در برابر اعشاری

واحد محاسبات در پردازنده‌ها به‌طور کلی با دو نوع داده سروکار دارد:

  • محاسبات اعداد صحیح (Integer یا SPECint): این آزمون‌ها روی اعداد بدون اعشار انجام می‌شوند و شامل عملیات منطقی، پردازش متن، کنترل جریان برنامه و آدرس‌دهی حافظه هستند. برنامه‌هایی نظیر کامپایلرهای کد (502.gcc)، الگوریتم‌های فشرده‌سازی (557.xz) و هوش مصنوعی پایه (531.deepsjeng) در این دسته قرار می‌گیرند. این محاسبات معمولاً سرعت تصمیم‌گیری و عملکرد Cache پردازنده را به چالش می‌کشند.
  • محاسبات ممیز شناور (Floating-Point یا SPECfp): این بخش به محاسبات پیچیده علمی و مهندسی اختصاص دارد که نیازمند دقت بالایی هستند و واحد ممیز شناور (FPU) پردازنده را درگیر می‌کنند. شبیه‌سازی دینامیک سیالات (519.lbm)، رندرینگ سه‌بعدی (526.blender) و پیش‌بینی وضعیت هوا (521.wrf) نمونه‌هایی از این آزمون‌ها هستند. این دسته معمولاً وابستگی شدیدی به پهنای باند حافظه دارد.

نحوه اجرای بار کاری: Speed در برابر Rate

  • معیار Speed (سنجش زمان پاسخ‌دهی): این معیار زمان مورد نیاز برای تکمیل یک کار واحد را اندازه‌گیری می‌کند. در این حالت، یک نسخه از برنامه اجرا می‌شود و در صورت امکان، با استفاده از قابلیت‌های چندرشته‌ای روی چندین هسته پردازنده پخش می‌شود. واحد این بخش زمان است؛ در واقع یعنی کاهش زمان برابر است با عملکرد بهتر.
  • معیار Rate (سنجش توان عملیاتی): این معیار ظرفیت سیستم را در انجام چندین کار هم‌زمان می‌سنجد. در این حالت، چندین کپی مستقل از یک برنامه اجرا می‌شوند تا مشخص شود سیستم در یک بازه زمانی مشخص چه مقدار خروجی دارد.

مدیریت منابع پردازشی: مفهوم Copies و Threads

تفاوت ماهیتی آزمون‌های Speed و Rate در نحوه تخصیص وظایف به پردازنده است که با دو پارامتر کلیدی مشخص می‌شود:

  • مفهوم Copies (نسخه‌ها): این پارامتر مختص آزمون‌های Rate است. زمانی که شما آزمون را با تعداد مشخصی کپی اجرا می‌کنید، سیستم دقیقاً همان تعداد پروسه کاملاً مستقل از برنامه را در حافظه بارگذاری کرده و اجرا می‌کند. هر کپی فضای آدرس حافظه اختصاصی خود را دارد و بدون وابستگی به بقیه کار می‌کند. این روش دقیقاً شبیه‌ساز محیط‌هایی مانند وب‌سرورها یا دیتابیس‌هاست که باید به درخواست‌های مستقل کاربران متعددی پاسخ دهند.
  • مفهوم Threads (رشته‌های پردازشی): این پارامتر مختص آزمون‌های Speed است. وقتی آزمون را با تعداد مشخصی Thread اجرا می‌کنید، تنها یک کپی از برنامه در حافظه اجرا می‌شود، اما بار پردازشیِ همان یک برنامه بین هسته‌ها تقسیم می‌شود. در این حالت، تمامی رشته‌ها به یک فضای حافظه مشترک دسترسی دارند و باید با یکدیگر هماهنگ باشند. این روش شبیه‌ساز پردازش‌های سنگین یکپارچه مانند رندرینگ یک فریم ویدیویی پیچیده است که در آن همه هسته‌ها برای حل یک مسئله واحد بسیج می‌شوند.

منطق ریاضی ارزیابی: امتیازها چگونه محاسبه می‌شوند؟

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

دستگاه مرجع (Reference Machine)

برای اینکه ارزیابی‌ها دارای یک مبنای استاندارد باشند، SPEC زمان اجرای هر بنچمارک روی سیستم شما را با زمان اجرای همان بنچمارک روی یک سرور قدیمی مقایسه می‌کند. فرمول پایه برای محاسبه نسبت به این شکل است:

نسبت عملکرد = (زمان دستگاه مرجع) تقسیم بر (زمان سیستم تحت آزمایش)

برای مثال، اگر دستگاه مرجع تستی را در ۱۷۷۵ ثانیه انجام دهد و سرور شما آن را در ۳۵۴ ثانیه تمام کند، امتیاز آن تست ۵.۰ خواهد بود؛ میشه گفت سیستم شما ۵ برابر سریع‌تر است.

دلیل استفاده از میانگین هندسی

یک سیستم در طول آزمون ده‌ها بنچمارک مختلف را اجرا می‌کند. SPEC برای محاسبه امتیاز نهاییِ کل سیستم، به جای میانگین حسابی از میانگین هندسی استفاده می‌کند. دلیل مهندسی این انتخاب آن است که میانگین هندسی تأثیر مقادیر بسیار بالا یا بسیار پایین را تعدیل می‌کند. اگر از میانگین حسابی استفاده می‌شد، عملکرد فوق‌العاده بالا در یک تست خاص می‌توانست ضعف شدید سیستم در تست‌های وابسته به رم را پنهان کند. میانگین هندسی تضمین می‌کند که تنها سیستم‌های متوازن در تمام ابعاد، امتیاز کل بالایی دریافت کنند.

نحوه بررسی و تطبیق نتایج (Validation)

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

  • امتیاز Base (پایه): در این حالت تمامی بنچمارک‌ها باید با تنظیمات و فلگ‌های کامپایلر یکسان اجرا شوند. این امتیاز نشان‌دهنده عملکرد سیستم در شرایط استاندارد و پایدار است.
  • امتیاز Peak (بهینه): در این حالت مهندسان مجازند برای هر بنچمارک، فلگ‌های کامپایلر متفاوتی را تنظیم کنند تا بالاترین پتانسیل سخت‌افزار استخراج شود.

برای ارزیابی صحت عملکرد سیستم خود، می‌توانید نتایج Base را با دیتابیس رسمی SPEC مقایسه کنید. با جستجوی مدل دقیق پردازنده، می‌توانید مشاهده کنید که تولیدکنندگان سخت‌افزار چه امتیازی را در شرایط مشابه ثبت کرده‌اند.

مروری بر فرآیند اجرای بنچمارک

نکته: مجموعه SPEC CPU یک نرم‌افزار تجاری است و برای دانلود و استفاده از آن، سازمان‌ها نیازمند تهیه لایسنس رسمی هستند.

اجرای این بنچمارک در محیط‌های لینوکسی نیازمند طی کردن مراحل مشخصی است:

  1. نصب و بارگذاری محیط: اجرای اسکریپت install.sh و سپس بارگذاری متغیرهای محیطی با دستور source shrc.
  2. پیکربندی (Config File): فایل کانفیگ قلب تپنده اجرای SPEC است. در این فایل، مسیر کامپایلرها، فلگ‌های مربوط به بهینه‌سازی و سازگاری تعریف می‌شوند.
  3. انتخاب حجم داده (Size): اجرای آزمون‌ها معمولاً در سه سطح انجام می‌شود:
    • test: حجم داده بسیار کم برای بررسی صحت عملکرد اولیه سیستم.
    • train: حجم داده متوسط برای آموزش بهینه‌سازی‌های کامپایلر.
    • ref: داده‌های حجیم و اصلی که برای ثبت نتایج نهایی استفاده می‌شوند.
  4. اجرا: فراخوانی ابزار runcpu با تعیین نوع آزمون.

بهینه‌سازی (Tuning): لایه‌های تأثیرگذار بر عملکرد

برای دستیابی به نتایج واقعی و استخراج پتانسیل نهایی پردازنده، اجرای خام بنچمارک کافی نیست. سیستم باید به دقت پیکربندی شود. این بهینه‌سازی در سه لایه کلیدی انجام می‌شود:

لایه اول: سیستم‌عامل (OS Tuning)

برای اجرای بنچمارک‌های سازمانی، معمولاً از سیستم‌عامل‌های پایدار نظیر RHEL یا نسخه‌های پشتیبانی‌شده Ubuntu LTS استفاده می‌شود.

  • مدیریت حافظه: فعال‌سازی قابلیت Transparent Huge Pages به پردازنده اجازه می‌دهد بلوک‌های بزرگتری از رم را آدرس‌دهی کند که خطاهای TLB Miss را در کارهای سنگین کاهش می‌دهد.
  • رفع محدودیت‌ها: محدودیت حافظه پشته باید با دستور ulimit -s unlimited برداشته شود؛ در غیر این صورت بنچمارک‌های پیچیده با خطای کمبود حافظه مواجه می‌شوند.
  • پایداری فرکانس: فرماندار پردازنده باید روی حالت Performance تنظیم شود تا از کاهش فرکانس در لحظات کوتاه بیکاری جلوگیری گردد.
  • توپولوژی NUMA: استفاده از ابزارهایی نظیر numactl برای متصل کردن پروسه‌ها به نزدیک‌ترین نود حافظه، تأخیر در دسترسی به رم را به شدت کاهش می‌دهد.

لایه دوم: بایوس و سخت‌افزار (BIOS Tuning)

در سطح مادربرد، باید مدیریت مصرف انرژی را به نفع کارایی غیرفعال کرد:

  • حالت‌های مصرف انرژی (C-States): این قابلیت‌ها باید خاموش شوند. وقتی یک هسته به حالت خواب می‌رود، بیدار شدن آن برای پردازش اطلاعات جدید چند میلی‌ثانیه زمان می‌برد که در بنچمارک‌های حساس، باعث افت شدید امتیاز می‌شود.
  • Hyper-Threading یا SMT: برای آزمون‌های Speed، معمولاً این قابلیت خاموش می‌شود تا هسته‌های فیزیکی بر سر منابع داخلی کش با هسته‌های مجازی رقابت نکنند. اما برای آزمون‌های Rate، روشن بودن آن می‌تواند ظرفیت خروجی را افزایش دهد.
  • پروفایل حافظه: فعال‌سازی پروفایل‌های XMP یا تنظیم کلاک رم روی بالاترین سرعت پشتیبانی‌شده ضروری است.

لایه سوم: کامپایلر (Compiler Tuning)

کامپایلر، مترجمی است که کدهای C یا Fortran را به زبان صفر و یک پردازنده تبدیل می‌کند. هرچه این مترجم هوشمندتر باشد، امتیاز بالاتر می‌رود. اگرچه می‌توان از کامپایلر استاندارد لینوکس (GCC) استفاده کرد، اما در دنیای حرفه‌ای از کامپایلرهای تخصصی استفاده می‌شود.

چرا از کامپایلر Intel oneAPI استفاده می‌شود؟ استفاده از کامپایلرهای تجاری شرکت اینتل مزیتی رقابتی در پردازنده‌های x86 ایجاد می‌کند. این کامپایلرها با شناخت مهندسی و دقیق از معماری سخت‌افزار اینتل، می‌توانند:

  • استفاده بهینه از دستورالعمل‌های برداری: این کامپایلرها کدها را به گونه‌ای ترجمه می‌کنند که به بهترین شکل از واحدهای محاسباتی AVX-512 پردازنده استفاده شود.
  • پیش‌بینی و پیش‌بارگذاری (Prefetching): کامپایلر اینتل می‌داند چگونه داده‌ها را کمی زودتر از رم به کش پردازنده بیاورد تا پردازنده بیکار نماند.
  • باز کردن حلقه‌ها (Loop Unrolling): با بازنویسی ساختار حلقه‌های تکراری در کد ماشین، سرعت پردازش را به شدت افزایش می‌دهد.

فلگ‌های بهینه‌سازی (Optimization Flags): مهندسان با اضافه کردن سوئیچ‌هایی در فایل کانفیگ، به کامپایلر دستورات خاصی می‌دهند:

  • -O3: به کامپایلر می‌گوید حداکثر زمان را برای تحلیل کد و تولید سریع‌ترین کد ماشین ممکن صرف کند.
  • -march=native: به کامپایلر می‌گوید کد را منحصراً برای معماری همان پردازنده‌ای که در حال کامپایل روی آن است بهینه‌سازی کند.
  • -flto: بهینه‌سازی کدهای برنامه به صورت یکپارچه در مرحله نهایی لینک شدن.
  • PGO (Profile-Guided Optimization): در این تکنیک، برنامه یک بار با داده‌های آزمایشی اجرا می‌شود، کامپایلر گلوگاه‌ها را شناسایی کرده و سپس برنامه را دوباره برای عملکرد بهتر بازنویسی می‌کند.

مدیریت پیشرفته تخصیص حافظه (jemalloc): در حالت پیشرفته، به جای استفاده از توابع مدیریت حافظه استاندارد لینوکس، از کتابخانه jemalloc استفاده می‌شود. این کتابخانه در مدیریت تخصیص حافظه برای برنامه‌های چندرشته‌ای فوق‌العاده کارآمد است و پدیده گسستگی حافظه را به حداقل می‌رساند که نتیجه آن پرش چشمگیر در امتیاز بنچمارک است.

نتیجه‌گیری

در مجموع، بنچمارک‌گیری با SPEC CPU2017 صرفاً اجرای یک نرم‌افزار مانیتورینگ نیست؛ بلکه یک فرآیند دقیق مهندسی است. درک تفاوت میان بارهای کاری مختلف، شناخت مفاهیمی چون Copies و Threads، تسلط بر پیکربندی کامپایلرهای تخصصی و تنظیمات سیستم‌عامل، عواملی هستند که به تیم‌های زیرساخت کمک می‌کنند تا ظرفیت واقعی سخت‌افزار خود را ارزیابی کرده و معماری دیتاسنتر را بر اساس داده‌های علمی بهینه‌سازی کنند.

طراحی، اجرا و تحلیل دقیق چنین فرآیند پیچیده‌ای، از بررسی معماری تا بهینه‌سازی در لایه‌های مختلف، معمولاً نیازمند حضور متخصصانی در حوزه مهندسی عملکرد است. تیم متخصصین گزمه، با بهره‌گیری از تجربه عمیق و دانش فنی خود در این حوزه، آماده است تا فرآیند ارزیابی و بهینه‌سازی زیرساخت‌ها را برای سازمان شما برنامه‌ریزی و اجرا کرده و مسیر دستیابی به بالاترین سطح کارایی سخت‌افزاری را هموار سازد.