برای افزایش سرعت اجرای برنامه ها در متلب چه باید کرد؟ — ۸ نکته مهم و کاربردی

 

برای افزایش سرعت اجرای برنامه ها در متلب چه باید کرد؟ -- 8 نکته مهم و کاربردی

 

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

 

 

برای افزایش سرعت اجرای برنامه ها در متلب چه باید کرد؟ -- 8 نکته مهم و کاربردی

 

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

 

۰) حافظه را مدیریت کنید. در برخی برنامه ها مدت زمان زیادی صرف تخصیص حافظه می شود. این پست (+) در متلب سایت این موضوع را به خوبی توضیح می دهد. بطور خلاصه با این کار شما زمان تلف شده برای ایجاد و حذف متغیرها در متلب را از میان بر می دارید.

 

۱) نمایش متغیر های اضافی را متوقف نمایید. بسته به سرعت کارت گرافیکی، ممکن است شما در لوپ های درونی متغیرهایی را نشان دهید که به دلیل سرعت بالای اجرای برنامه در ظاهر دیده نشوند. این متغیرها می توانند سرعت زیادی از برنامه بگیرند. تنها متغیرهایی را نشان دهید که واقعاً برای مانیتورینگ نیاز هستند.

 

۲) سعی کنید لوپ های اضافی و زاید برنامه تان را حذف کنید و تا حد ممکن برداری کار کنید. مثلاً یک برنامه آموزش شبکه عصبی به صورت برداری می تواند ۱۰۰ ها برابر با برنامه ای که عملیات را به جای بردارها با استفاده از حلقه های for اضافی انجام می دهد، تفاوت داشته باشد.

 

۳) به جای توابع جستجو همانند دستور find، معادل منطقی آنها را استفاده نمایید. مثلاً اگر می خواهید عناصر مساوی ۱۰ در یک بردار را پیدا کرده و آنها را با ۲۰ جایگزین کنید، وقت برنامه را برای پیدا کردن اندیس تک تک ۱۰ ها و جایگزینی آنها با ۲۰ تلف نکنید. یعنی به جای

>> I  = find(A==10);

>> A(I) = 20;

بصورت ساده ای بنویسید:

>> A(A==10)=20;

 

۴) با استفاده از امکانات بخش Profiler در متلب برنامه تان را از لحاظ زمانی، آنالیز کنید و bottleneck (گلوگاه) های زمانی را پیدا کرده و رفع نمایید. این بخش متلب زمان صرف شدن در هر تابع و زیر تابع را به شما می دهد. شکل زیر نمایی از Profiler در متلب را نشان می دهد.

نمونه ای از عملکرد Profiler در متلب

 

۵) برنامه در حالت پی کد (pcode)، معمولاً سریعتر از حالت عادی اجرا می شود. همچنین پی کد کردن امکان خوبی برای در اختیار گذاشتن برنامه دیگران هست. زیر آنها می توانند برنامه شما را اجرا کنند ولی نمی توانند داخل آن را مشاهده نمایند.

 

۶) از parfor به جای for معمولی برای اجرای موازی برنامه خود استفاده نمایید. در این حالت باید از پردازنده چند هسته ای مثلا Core2 و … استفاده نمایید. در این حالت می توان تقریباً به تعداد هسته ها برنامه را سریعتر نمود. همچنین توجه نمایید که باید تغییرات مختصری در برنامه خود ایجاد نمایید. در این حالت داشتن memory بالا نیز نیاز هست.

 

۷) از MEX برای اجرای بخشی از برنامه خود در زبان سی (C) استفاده نمایید. متلب این قابلیت را دارد که کدهای نوشته شما در متلب را به راحتی به کد سی تبدیل نماید. در این حالت باید برنامه متلب را تا حد زیادی آماده برای این کار نمایید. مثلاً ماتریس ها باید مقدار دهی اولیه شوند (pre-allocation). در این مورد به زودی فیلم جامعی در متلب سایت عرضه خواهد شد. در طی این مدت سعی کنید از راهنمای متلب استفاده نمایید.

 

شما چه استراژی هایی را در برنامه هایتان برای افزایش سرعت برنامه هایتان استفاده می کنید؟

تجربیات خود را در پایین همین پست از طریق بخش ارسال نظر منتشر کنید.

مطالب پیشنهادی‎

۱۰ نظر در "برای افزایش سرعت اجرای برنامه ها در متلب چه باید کرد؟ — ۸ نکته مهم و کاربردی"
  1. با سلام من شنیدم که در نرم افزار متلب

    می تونیم حلقه های For موازی رو به صورت هم زمان بر روی سیستم های چند هسته ای ، بر روی هر Core اجرا کنیم .

    به این معنی که ۴ حلقه For که به یکدیگر وابسته نیستند رو روی هر هسته از سیستم اجرا کنیم تا زمان پردازش در آن قسمت کم شود.

    ولی من به شخصه تست نکردم.

    دوستان اگه کار کردن توضیح بیشتر بدن.

  2. با سلام.
    ممنون از پست بسیار مفیدتون.
    یکی از کارهایی که روی رقابت استعماری انجام داده بودم و برای مقاله آماده کرده بودم نیاز به اجرا روی benchmark های ۱۰۰۰ بعدی داشتم که طبیعتا زمان اجرا بیشتر میشد.
    من حلقه های for این برنامه که قابلیت موازی شدن رو داشتن به parfor تبدیل کردم و به طور شگفت انگیزی سرعت برنامه کندتر شد!!!
    اگر برای استفاده از parfor نیاز به پیش نیازهایی هست راهنمایی کنید ممنونم میشم.
    در جواب دوستمون john هم که تا جایی که قبلا تحقیق کرده بودم متلب قابلیت multithreading رو نداره و اگه مثل C# این قابلیت رو داشت که فوق العاده عالی بود.

    1. با سلام.

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

      در ضمن توجه داشته باشید که سرعت اجرای خود الگوریتم رقابت استعماری بالاست. هر نوع کندی، بیشتر خود را در فراخوانی توابع هزینه نشان می دهد. باید انرژی خود را بر روی موازی کردن این بخش از محاسبات بگذارید، نه خود الگوریتم. لینک زیر کمی توضیح مرتبط در این باره را در مورد مباحث ارزیابی سرعت می دهد.
      نحوه مقایسه کارکرد دو الگوریتم بهینه سازی

      موفق باشید.
      متلب سایت

  3. من برای اندازه گیری مدت زمان اجرای یک برنامه از tic,toc استفاده می کنم. ولی نمی دانم چرا هر دفعه که برنامه را اجرا می کنم یک جواب دیگه می دهد؟ واقعا مدت زمان اجرای یک دستور رو چگونه می توان اندازه گرفت ؟

    1. نباید این طور باشه چون من از این دستور زیاد استفاده کردم و چنین تجربه ای رو نداشتم.
      پیشنهاد می کنم از tictoc های بیشتری در برنامه استفاده کنید تا اون بخش از کد که این بی نظمی درش اتفاق میفته رو پیدا کنید.
      موفق باشید.

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

  4. با سلام اگه ممکنه راهنمایی کنید که چه طور میشه از یک pcode اجرا گرفت چون من هر کاری کردم نتونستم . اصلا وقتی دکمه open متلب را میزنم این فایل ها را جزو فایلهای قابل اجرا نشون نمیده!!!!!!!!!!!!!!

  5. میشه یکی توضیح بده که منظور از “سعی کنید لوپ های اضافی و زاید برنامه تان را حذف کنید و تا حد ممکن برداری کار کنید.” چیه؟ به نظر من به جز مدیریت حافظه و Preallocation بقیه راهها خیلی کاربردی نیستند

  6. با سلام در مورد کامنت دوستمون راجع به پردازش ۴حلقه روی ۴هسته فکر نکنم عملی باشه چون سیستم عامل وظیفه این کارو داره و فکر نکنم مطلب بتونه سیستم عامل رو وادار به این کار بکنه

  7. بعقیده بنده، مدیریت برنامه و تلاش برای افزایش سرعت پردازش، نیاز به اندیشه و تجربه داره. مثلا کم کردن متغیرها تا حد امکان. استفاده از break در دستورات حلقه ای شرطی، اجرای زیر برنامه های قبلی و حاضر نمودن متغیرها در workspace بجای function, جزیی از اقداماتی است که خود من جواب گرفتم. المان بندی مناسب نابرابر هم میتونه مفید باشه. اینها فارغ از سخت افزار سبستم هست.

پاسخ دادن به eag لغو پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *