دانشنامه تخصصی مهندسی ایران

دانشنامه تخصصی مهندسی ایران

 engpedia   راه اندازی کانال تلگرام ( EngPedia_ir@ )

                همراه با مطالب ویژه سایت بصورت رایگان

  • نسخه ۱۲.۱ نرم افزار Aveva Marine در سایت قرار گرفت. (اینجا)
  • نسخه ۱۰.۵۲ نرم افزار Plus 2D در سایت قرار گرفت. (اینجا)
  • نسخه ۱۱.۰ نرم افزار AGI Systems Tool Kit-STK در سایت قرار گرفت.(اینجا)

همکاران

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

مدیریت شهریور ۲۹, ۱۳۹۳ 5726 بازدید ۵دیدگاه

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

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

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

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

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

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

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

۱- پیش تعریف آرایه‌ها
۲- بردارسازی برنامه
۳- کاربرد فایل MEX تفسیر شده

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

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

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

کد:

 بردارسازی برای محاسبات آرایه ای که شامل استثناء در محاسبات نیستند، مناسب می‌باشد. به بیان دیگر هرگاه بخواهیم عمل محاسباتی ای را بدون وجود استثنا بر روی مجموعهٔ بزرگی از داده‌ها اعمال کنیم، بهتر است از بردارسازی کمک بگیریم. بردارسازی بر روی الگوریتم‌هایی که شامل تعدادزیادی استثناء یا ساختارهای نامنظم هستند، خوب عمل نمی‌کند. استفاده از بردارسازی در این چنین محاسباتی موجب می‌شود که برنامه پیچیده تر شود و در نتیجه فهم، نگهداری و اشکال زدایی برنامه سخت تر گردد. در برخی شرایط ممکن است که استفاده از بردارسازی ممکن نباشد یا حتی استفاده از آن سرعت اجرای برنامه را به دلیل افزایش کاربرد حافظه کاهش دهد. در این شرایط باید حلقه‌ها و توابع را تبدیل به فایل‌های 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 دارای زمان اجرای ۲.۷ ثانیه می‌باشد. چگونه فایل‌های MEX سرعت اجرای الگوریتم مثال بالا را تقریباً ده برابر افزایش داده است.

منبع: www.eetimes.com

نظرات شما باعث دلگرمی و پیشرفت ما می شود.

telegram: @EngPedia_ir

5 پاسخ به “افزایش سرعت MATLAB بوسیله MEX”

  1. نرگس گفت:

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

  2. سالار گفت:

    سلام
    من یک برنامه نوشته شده ++c دارم. چطور باید به mex تبدیلش کنم؟
    ممنون میشم راهنماییم کنید. آشنایی زیادی با متلب ندارم. علاوه بر متلب کامپایلرc مپهم نصب کردم

  3. پرستو گفت:

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

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

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