HPC Code Optimization
خدمات بهبود کدهای نرم افزاری نوشته شده در حوزه HPC
-
ارسال مستندات و کدهای نوشته شده توسط فرد متقاضی در قالب فرم درخواست بهینه سازی کد به همراه ذکر مشکل
-
بررسی اولیه مستندات توسط کارشناسان شرکت و تخمین مدت زمان مورد نیاز برای اصلاح و بهینه سازی کد در قالب نفر-ساعت
-
محاسبه هزینه نفر ساعت بر مبنای جدول زیر و پرداخت 50 درصد از هزینه توسط متقاضی
-
تخصیص کارشناس متخصص در شرکت به درخواست متقاضی
-
شروع فرآیند بهینه سازی و اصلاح کد توسط کارشناس مربوطه
-
اصلاح نهایی کد نوشته شده در حد امکان و تهیه گزارش مکتوب از اصلاحات مورد نیاز یا اصلاحات انجام شده و میزان بهبود زمانی و حافظه ای بدست آمده(در صورت درخواست)
-
تسویه حساب
-
ارسال کد اصلاح شده و گزارش نهایی برای متقاضی
زبان برنامه نویسی/ابزار | هزینه کارشناسی نفر-ساعت(ریال) | هزینه تهیه گزارش(ریال) |
Python | Call | Call |
++C/C | Call | Call |
Java | Call | Call |
Fortran | Call | Call |
MATLAB | Call | Call |
Mathematica | Call | Call |
(Spark(Scala | Call | Call |
(Spark(Python | Call | Call |
بهبود کد به فرآیندی اتلاق می شود که در آن بدون تغییر در کارکرد عملیاتی یک کد نوشته شده، عملکرد آن از بعد زمان اجرا، میزان اشغال منابع، تکنیکهای برنامه نویسی و ... بهبود یابد.
معمولا در کاربردهای غیر علمی نرم افزارها و کدهای نوشته شده میزان حافظه اشغال شده توسط یک کد نرم افزاری دارای اهمیت نمی باشد. میزان اشغال حافظه می تواند بر عملکرد یک نرم افزار و کد نوشته شده تاثیر مثبت یا منفی بگذارد. کارایی زمان اجرا می تواند متاثر از مواردی از قبیل جایگذاری کد های با هزینه کمتر با کدهای پرهزینه باشد، علاوه بر این تکنیکهای از جمله پیاده سازی مفاهیم برداری سازی متغیرها، برنامه نویسی چند نخی و موازی سازی می تواند باعث ارتقاء کارایی کدهای نرم افزاری شود. زمانی که یک کد نرم افزاری بهینه بر مبنای معیار درجه پیچیدگی Big-O نوشته می شود، می توان از طریق تکنیک های پروفایل سازی در کامپایلر از قبیل اندازه گیری نقاط کلیدی در کد نرم افزاری و پارامترهای کنترلی درون کامپایلرها آن را اندازه گیری کرده و ارتقاء داد.
اولین قدم در بهبود کد، انتخاب الگوریتم مناسب و کارا است. معیار درجه پیچیدگی Big-O برای دسته بندی کارایی الگوریتمها از بعد زمان اجرا یا میزان فضای مورد نیاز به کار می رود. به عنوان مثال الگوریتم مرتب سازی QuickSort دارای درجه پیچیدگی (O(nlogn است و در همه حالات از الگوریتم SelectionSort با درجه پیچیدگی (O(n2 کاراتر است.
بهینه سازی کد
بهینه سازی کامپایل
به عنوان مثال در کامپایلر Intel پارامتر –O2 سطحی از بهینه سازی را در زمان کامپایل فراهم می کند که 2 نشان دهنده میزان خاصی از موازی سازی است. راهنمای بهینه سازی (Profile Guided Optimization) در کامپایلر Intel برای شناسایی هات اسپات هایی است که می تواند باعث افت کارایی شود، به این عمل profiling گویند.
بهبود سطح کارایی یا کاهش حجم کد برنامه فرایندی است که باید در زمان کامپایل انجام شود و این موضوع یکی از قدرتهای کامپایلر محسوب می شود.
نکته ای که باید به آن توجه کرد این است که کامپایلر نمی تواند الگوریتم SelectionSort را با QuickSort جایگزین کند.
موازی سازی
انواع روشهای موازی به شرح زیر می باشند:
- Bit Level Parallelism
با توسعه تکنولوژی VLSI اندازه کلمه در پزدازنده ها افزایش پیدا کرده و توانایی بالاتری در ارتقاء کارایی از خود نشان داده اند. برای مثال پردازنده های 32 بیتی می توانند دو عدد 32 بیتی را با سرعت بیشتری نسبت به پردازنده 16 بیتی با هم جمع کنند، چرا که یک پردازنده 16 بیتی برای جمع دو عدد 32 بیتی می بایست آن را به دو بخش بالایی و پایینی تقسیم کند که این امر موجب ایجاد سربار محاسباتی می شود.
- Instruction Level Parallelism
در این روش کامپایلر سعی می کند دستوراتی را که می توانند با یکدیگر اجرا شوند و وابستگی داده ای به یکدیگر ندارند در یک Cycle یا Clock اجرا نماید. این دستورات باید حداقل وابستگی را به یکدیگر داشته باشند. تکنیک های مرسوم در این روش موازی سازی به قرار زیر هستند:
1- (Explicitly Parallel Instruction Computing (EPIC
در این روش در یک Cycle بین دو تا 16 دسترالعمل قابل اجرا است که هر چه تعداد دستورات غیروابسته به هم کمتر باشد درصد بالاتری از موازی سازی را ایجاد می کند.
2- Out of Order Execution/Register Renaming
در این روش امکان اجرای دستورات بیشتری در یک Cycle وجود دارد که با تغییر نام ثبات ها می توان به این حالت دست یافت.
3- Speculative Execution
اجرای تمام یا بخشی از دستورات صرف نظر از اینکه زمان اجرای آن فرا رسیده است یا خیر.
4- Vectorization
این یکی از حالات خاص از مدل (SIMD (Simple Instruction Multiple Data اقای Flynn است که در آن یک دستور می تواند روی چندین داده به صورت همزمان کار کند. چیپ ست های x86 دارای معماری مجموعه دستورالعمل های (SSE (Streaming SIMD Extension هستند. برداری سازی به صورت خودکار پس از انتخاب پارامتر مناسب زمان کامپایل توسط کامپایلر انجام می شود.
- Threading/Multi-threading
در این مدل نخ های اجرایی ایجاد می شود که به صورت همزمان اجرا می شوند.
Accelerated Computing
در این روش از سخت افزارهای همه منظوره GPU استفاده می شود که از برخی روشهای نرم افزاری بهتر عمل می کند. Intel Xeon Phi و (GPUs(CUDA دو سخت افزار مشهور در این مدل محاسباتی هستند که توانسته اند انقلابی عظیم در دنیای HPC ایجاد کنند و در تقابل با CPU قرار بگیرند. NVIDIA GPUs برای حل مسائل از مدل Single Instruction Multiple Thread استفاده می کند و در در مقابل Xeon Phi قرار دارد که برای برنامه نویسانی که با روشهای کدنویسی همچونPthread, OpenMP, MPI, CUDA آشنا هستند کمتر شناخته شده است. همه مسائل مناسب اجرا روی Accelerator ها نمی باشند و معمولا مسائلی که دارای تعداد زیاد محاسبه با داده های کم هستند را می توان بر این بستر اجرا کرد.
روشهای بهینه سازی
13. Loop Fission/Distribution
14. Loop Fusion/Combining
15. Prefetching
16. Memory Bank Optimization
17. If Optimization
18. Register Allocation
19. Instruction Scheduling
20. Data Alignment and Padding
21. Structure of Arrays Over Array of Structures
22. Loop Invariant Branches
23. Operations with Power of 2
- Dead code Elimination or Dead Code Stripping
- Common Sub-Expression Elimination
- Loop-Invariant Code Motion or Hoisting of invariant from loops
- Loop Unwinding or Unrolling
- Jump Removal/Branch Elimination
- Constant Folding
- Inlining
- Trace Scheduling
- Arithmetic Simplification
- Tail call optimization
- Iteration order reversal or Loop Termination