افزایش سرعت MATLAB بوسیله MEX

9485 بازدید

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

افزایش سرعت MATLAB بوسیله MEX

این مقاله به مرور روش‌های افزایش سرعت نرم افزار MATLAB می‌پردازد و مباحثی چون آنالیز عملکرد برنامه، بردارسازی و تبدیل کدهای MATLAB به فایل‌های MEX را پوشش می‌دهد.

 

چرا سرعت MATLAB پایین است؟
MATLAB یک زبان ترجمه شده (interpreted) می‌باشد. این بدان معنی است که هر عملیات نیاز به پردازش اضافی دارد. در زبان‌های تفسیر شده چون C یا ++C این زمان اضافی را نداریم. MATLAB دارای مکانیزم ایجاد کد بصورت لحظه ای و فوری می‌باشد که این مشکل را در مواردی کاهش می‌دهد.

برای انجام یک دستورالعمل ساده در MATLAB، مترجم باید به اپرندهای مربوطه رجوع کند و محاسبات صحیح را برای اجرا انتخاب کند. این انتخاب بستگی به انواع داده (حقیقی، مختلط، کاراکتر، منطقی و…) و شکل اپرندها (اسکالر، ردیف، ستون، ماتریس و…) دارد. هنگامی که دستورالعمل‌ها انجام شد، مقادیر بدست آمده باید ذخیره شود. برای یک تخصیص حافظه ساده، مترجم MATLAB باید هر دو اپرند ورودی و خروجی را مد نظر قرار دهد و تصمیم بگیرد که آیا احتیاج هست که حافظهٔ بیشتری اختصاص یابد یا اینکه مقادیر بدست آمده باید در عمل اختصاص حافظه تبدیل شوند.

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

توجه کنید که اگر 80 درصد زمان اجرا به 20 خط از برنامه یا اجرای یک تابع اختصاص یابد، این قسمت همان جایی است که باید بهینه گردد.

استفاده از ابزار MATLAB Profiler راه بسیارخوبی در تشخیص نقاطی از برنامه است که اجرای آن سنگین می‌باشد. این نقاط که اجرای آن سخت و وقت گیر است، اصطلاحا تنگه برنامه نامیده می‌شود. این ابزار را می‌توان به دو صورت فراخوانی و استفاده نمود. راه اول استفاده از دستور profile در خط فرمان MATLAB می‌باشد و راه دیگر این است که در قسمت Desktop در صفحه اصلی MATLAB گزینه profile را انتخاب کنیم. این ابزار به شما اجازه می‌دهد تشخیص دهید که کدام قسمت از برنامه وقت بیشتری از پردازش را به خود اختصاص داده است.

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

1- پیش تعریف آرایه‌ها
2- بردارسازی برنامه
3- کاربرد فایل MEX تفسیر شده

این روش‌ها تنها برای برنامه‌هایی که شما نوشته‌اید کاربرد دارند. برای سریع کردن اجرای توابع داخلی و توکار MATLAB همانند filter و fft راه حل کلی وجود ندارد و در واقع این توابع به خوبی بهینه شده‌اند.

 

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

 

بردارسازی برنامه
راه حل کلی برای افزایش سرعت اجرا، بردارسازی می‌باشد. این کار را با جایگزین کردن حلقه‌ها و عملکردهای عددی با عملکردهای برداری انجام می‌دهیم. در راهنمای بردارسازی شرکت Mathworks می‌توانید روش‌های متعدد بردارسازی برنامه را پیدا کنید. در برنامه بالا، یک حلقه کار محاسبه میانگین اختلاف مطلق بلوک‌ها را به عهده دارد. می‌توان با کاربرد تابع sum بجای این حلقه، این قسمت را بردارسازی نمود. این تغییر ساده سرعت اجرای کلی برنامه را دو برابر افزایش می‌دهد.

کد:

% EngPedia.ir

function cost = costFuncMAD(currentBlk,refBlk, n)

% Non-vectorized code

% err = 0;

% for i = 1:n

% for j = 1:n

% err = err + abs((currentBlk(i,j) – refBlk(i,j)));

% end

% end

% Vectorized code

err = sum(abs(currentBlk(:) – refBlk(:)));

cost = err / (n*n);

 

بردارسازی برای محاسبات آرایه ای که شامل استثناء در محاسبات نیستند، مناسب می‌باشد. به بیان دیگر هرگاه بخواهیم عمل محاسباتی ای را بدون وجود استثنا بر روی مجموعهٔ بزرگی از داده‌ها اعمال کنیم، بهتر است از بردارسازی کمک بگیریم. بردارسازی بر روی الگوریتم‌هایی که شامل تعدادزیادی استثناء یا ساختارهای نامنظم هستند، خوب عمل نمی‌کند. استفاده از بردارسازی در این چنین محاسباتی موجب می‌شود که برنامه پیچیده تر شود و در نتیجه فهم، نگهداری و اشکال زدایی برنامه سخت تر گردد. در برخی شرایط ممکن است که استفاده از بردارسازی ممکن نباشد یا حتی استفاده از آن سرعت اجرای برنامه را به دلیل افزایش کاربرد حافظه کاهش دهد. در این شرایط باید حلقه‌ها و توابع را تبدیل به فایل‌های MEX نمود.

فایل‌های MEX همانند توابع داخلی MATLAB، فایل‌های کامپایل شده هستند. بنابراین بسیار سریع می‌باشند. کار با توابعی که بصورت فایل MEX در آمده‌اند بسیار ساده است. این توابع همانند دیگر توابع می‌توانند بطور مستقیم توسط MATLAB فراخوانده شوند. در MATLAB می‌توان با کاربرد دستور mex، فایل‌های MEX مبتنی بر C یا Fortran ایجاد کرد. درصورت استفاده از اینترفیس برنامه نویسی MEX (MEX API) کدهای C یا Fortran را باید به صورت دستی نوشت. توابع MEX قادرند ورودی را به طور مستقیم از MATLAB بخوانند، خروجی را به MATLAB بازگردانند و یا به متغیرهای سراسری دسترسی داشته باشند.

MEX API این امکان را فراهم می‌کند که از hook در برنامه استفاده نمود. به کمک hook می‌توان برای استفاده از توابع مصور سازی و … به MATLAB بازگشت. راهنمای MEX-file شرکت Mathworks اطلاعات بیشتری در مورد نوشتن فایل‌های MEX در اختیارتان قرار می‌دهد. پر واضح است که نوشتن فایل‌های MEX بطور دستی کاری وقت گیر است. از طرف دیگر احتمال اشتباه نیز زیاد است.

برای تبدیل کدهای MATLAB به C یا Fortran چندین کار باید انجام شود. در مرحله اول باید الگوریتم برنامه‌تان را که شامل توابع MATLAB می‌باشد، پیاده سازی کنید. به این منظور می‌توانید کدهای جدیدی بنویسید یا اینکه توابع و کتابخانه‌های موجود قبلی را فراخوانی کنید. درخلال نوشتن این کدها، باید با کاربرد روتین‌های مناسب مدیریت حافظه و تعریف متغیرهای داخلی عمل تخصیص حافظه را انجام دهید. در پایان باید بوسیله MEX API، کدها را با مدل MATLAB ارتباط دهید.

اشکال زدایی فایل‌هایی MEX سخت است چرا که در اشکالگیر (debugger) زبان C یا Fortran هیچ کدام از توابع تحلیل و مصورسازی MATLAB در دسترس نیست. همچنین زبانهای C یا Fortran نسبت به خطاها و اشکالات به اندازهٔ MATLAB حساس نیستند. راه ساده تری نیز وجود دارد و آن این است که که به طور اتوماتیک از طریق MATLAB فایل MEX را ایجاد کرد. به این ترتیب به طور کامل از محیط MATLAB به منظور اجرا و بهینه سازی برنامه‌تان بهره می‌گیرید. هر زمان که شما برنامه‌تان را تغییر دهید و آن را به فایل MEX تبدیل کنید، تغییرات اعمالی روی برنامه‌تان بر روی فایل MEX منعکس می‌گردد.

با کاربرد فناوری مفسر بهینه ساز می‌توانید برنامهٔ MATLAB را به فایل‌های پرسرعت MEX تفسیر نمایید. به این صورت برنامه ای که در MATLAB نوشته‌اید به طور داخلی به کدهای واسطه ای C ترجمه می‌شود. توانایی تولید کدهای C از MATLAB به شما تنها امکان تولید فایل‌های MEX را نمی‌دهد. بلکه با استفاده از آن می‌توانید مدل‌های ANSI مبتنی بر C ایجاد کنید. این مدل‌ها بصورت مستقل اجرا می‌شوند.

در برنامهٔ مثال بالا، ایجاد فایل MEX موجب می‌شود برنامه بالاترین سرعت اجرا را داشته اشد. در مثال بالا، برنامه اصلی دارای زمان اجرای s 46، برنامه بااعمال روش بردارسازی دارای سرعت اجرای s 26 و برنامهٔ فایل MEX دارای زمان اجرای 2.7 ثانیه می‌باشد. چگونه فایل‌های MEX سرعت اجرای الگوریتم مثال بالا را تقریباً ده برابر افزایش داده است.

مطالب مرتبط

دیدگاهتان را بنویسید

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

نشانی ایمیل منتشر نخواهد شد

نویسنده : آدرس سایت : ایمیل :
کد روبرو را وارد نمایید
captcha

تعداد 5 دیدگاه برای نوشته " افزایش سرعت MATLAB بوسیله MEX" ارسال شده است .

    نرگس 12 مهر 1393 در 6:39 ق.ظ
  1. باسلام
    برنامه من در محیط سیمولینک است و پس از گذشت زمان حدود ۴ ثانیه خظای کافی نبودن حافظه می ده
    ؟چجوری میشه حافظه برنامه رو ارتقا داد؟؟ممنون میشم سریعا راهنماییم کنید چون زمان کمی در اختیار دارم

  2. پاسخ
      مدیریت 12 مهر 1393 در 9:13 ق.ظ
    • سلام
      سرعت نرم افزار ارتباط زیادی به سیستم عامل و نسخه نرم افزار داره. منظورم 32 و 654 هست که 64 خیلی سریع تر جواب میده
      تو لینک زیر در این مورد و روشهای بهینه سازی توضیح داده:
      http://www.mathworks.com/help/matlab/matlab_prog/resolving-out-of-memory-errors.html
      با ف*ی*ل*ت*ر*ش*ک*ن برین!

    • پاسخ
    سالار 3 آذر 1394 در 7:49 ب.ظ
  3. سلام
    من یک برنامه نوشته شده ++c دارم. چطور باید به mex تبدیلش کنم؟
    ممنون میشم راهنماییم کنید. آشنایی زیادی با متلب ندارم. علاوه بر متلب کامپایلرc مپهم نصب کردم

  4. پاسخ
      مدیریت 5 آذر 1394 در 8:43 ب.ظ
    • دو راه داره
      یکیش اینه که کامپیایر Borland Builder رو نصب کنین
      آموزش در اینترنت هست

    • پاسخ
    پرستو 13 دی 1396 در 10:38 ق.ظ
  5. سلام، من یک برنامه ی متلب دارم ک سرعت ران شدنش خیلی پایین هست از بردار سازی هم نمیتونم استفاده کنم چون حلقه های فور پیچیده هستن
    یک راه حل به من معرفی کنین
    تشکر

  6. پاسخ

0

شبکه های اجتماعی

دانشنامه تخصصی مهندسی ایران را در شبکه های اجتماعی دنبال کنید

0 0

همکاران ما

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