یه نگاه خودمونی به تاثیر طراحی مبتنی بر داده و شی‌گرا روی سرعت و مصرف کش سی‌پی‌یو تو برنامه‌های هوش مصنوعی و چند ریسمانی!

Fall Back

اگه علاقه‌مند دنیای برنامه‌نویسی، مخصوصاً الگوریتم‌های هوش مصنوعی و کار با پردازنده‌های چند هسته‌ای باشی، احتمالاً واست سوال پیش اومده که استفاده از کد نویسی شی‌گرا (Object-Oriented Design یا OOD – یعنی همون روشی که با کلاس و آبجکت و کلی ساختارهای شیک کد می‌زنیم) بهتره یا بریم سراغ سبک جدیدتر و جمع‌وجورتر به اسم طراحی مبتنی بر داده (Data Oriented Design یا DOD – یعنی تمرکز رو فقط و فقط روی داده‌هامون باشه و همه چیزو براساس بهینه‌ترین حالت ذخیره و پردازش بدیم)؟

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

تو این تحقیق اومدن دقیق بررسی کردن که اگه ما الگوریتم معروف A* (یه الگوریتم پرکاربرد توی هوش مصنوعی برای پیدا کردن کوتاه‌ترین مسیر. مثلاً همون چیزی که GPS ازش استفاده می‌کنه) رو توی حالت‌های مختلف پیاده‌سازی کنیم، چه اتفاقی می‌افته. اونا چهار مدل مختلف کد زدن:

  1. شی‌گرا و تک ریسمانی (ST-OOD)
  2. مبتنی بر داده و تک ریسمانی (ST-DOD)
  3. شی‌گرا و چند ریسمانی (MT-OOD)
  4. مبتنی بر داده و چند ریسمانی (MT-DOD)

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

حالا اومدن همه این نسخه‌ها رو با معیارهایی مثل زمان اجرا (Execution Time)، حجم حافظه مصرفی (Memory Usage) و تعداد دفعاتی که سی‌پی‌یو نتونسته اطلاعات مورد نیازش رو تو کش پیدا کنه (Cache Misses) مقایسه کردن. Cache Miss یعنی وقتی سی‌پی‌یو دنبال یه داده‌ست و تو کش خودش پیداش نمی‌کنه، مجبور می‌شه از رم بیاره که خیلی کندتره.

نتیجه‌ها چی شد؟ تو نسخه‌های چند ریسمانی، طراحی مبتنی بر داده (همون DOD) واقعاً یه سر و گردن بهتر بود! یعنی هم کد سریع‌تر اجرا می‌شد، هم تعداد Raw System Calls (یعنی دفعاتی که برنامه واسه انجام کارهاش مستقیم می‌ره سروقت سیستم‌عامل) کمتر بود، و هم تعداد Cache Missها پایین‌تر می‌اومد. گاهی تو حجم حافظه مصرفی یا درصد خطاهای کش، شی‌گرایی یه مزیت کوچیک نشون می‌داد، ولی در کل سبک داده‌محور تو کارهای سنگین‌تر قدرتشو نشون داد.

یه نکته جالب: برخلاف حرف کلیشه‌ای که همیشه می‌گن برنامه‌های چند ریسمانی سریع‌ترن، تو همین تست‌ها دیدن اصلاً اینطوری نیست! چون مدیریت threadها (یا همون کنترل و هماهنگی بین چند بخش برنامه که باهم کار می‌کنن) خودش کلی سربار اضافی (Overhead) تحمیل می‌کنه، باعث شد هم تو شی‌گرایی، هم تو داده‌محور، نسخه‌های تک ریسمانی خیلی بهتر و راحت‌تر عمل کنن.

خلاصه حرف مقاله اینه که حتی اگه تو تست‌های ساده اختلاف‌ها کم باشه، ولی برتری DOD تو معیارهای مهم مثل سرعت و کش، تو پروژه‌های بزرگ و سنگین مخصوصاً هوش مصنوعی و پردازش موازی (Parallel Computing یعنی وقتی چند قسمت برنامه همزمان رو داده‌های مختلف کار می‌کنن) واقعاً ارزشمند و قابل اتکاست. پس اگه دوست داری فشنگ‌ترین و بهینه‌ترین کد رو بزنی، بد نیست یه نیم‌نگاهی به Data Oriented Design بندازی و فقط به شی‌گرایی دلبسته نمونی!

در کل، داستان برمی‌گرده به این که باید بر اساس سخت‌افزار امروزی، سبک طراحی‌مون رو هم آپدیت کنیم – فقط همینه که می‌تونه همه توان سخت افزار رو واسه هوش مصنوعی و پروژه‌های آینده بیرون بکشه!

منبع: +