ورود

View Full Version : افزایش سرعت برنامه های متلب با استفاده از MEX File



imnox66
یک شنبه 18 مرداد 1394, 23:17 عصر
MATLAB یک زبان ترجمه شده (interpreted) ست که در اون هر عملیات نیاز به پردازش اضافی داره. در زبان‌های تفسیر شده مثل C یا C++ این زمان اضافی رو نداریم. MATLAB دارای مکانیزم ایجاد کد بصورت لحظه ای و فوری هست که این مشکل را در مواردی کاهش می‌ده.
همونطور که می دونید سرعت اجرای حلقه ها و دستورات کنترلی در متلب پایینه. سه روش برای بهبود سرعت پردازش ها وجود داره: preallocation، بردارسازی و استفاده از توابعی به نام MEX File
پیش تعریف کردن آرایه ها و بردارسازی برنامه که نیازی به توضیح زیادی نداره و کسانی که با زبان متلب آشنایی داشته باشند می تونند به راحتی اون رو پیاده سازی کنند.
و اما MEX Fileها. در برخی شرایط ممکنه که استفاده از بردارسازی ممکن نباشه یا حتی استفاده از اون، سرعت اجرای برنامه را به دلیل افزایش کاربرد حافظه کاهش بده. در این شرایط باید حلقه‌ها و توابع را تبدیل به فایل‌های MEX نمود. فایل‌های MEX مانند توابع داخلی MATLAB، فایل‌های کامپایل شده هستند. بنابراین بسیار سریع هستند. کار با توابعی که بصورت فایل MEX در اومده‌اند بسیار ساده است. این توابع مانند دیگر توابع می‌تونند بطور مستقیم توسط MATLAB فراخوانده بشند. در MATLAB میشه با کاربرد دستور mex ، فایل‌های MEX مبتنی بر C یا Fortran ایجاد کرد.
برای اجرای فایل های MEX نیاز هست که ابتدا کامپایلر اون رو با کپی دستور زیر در Command window نصب نمود.

mex -setup
اما قبل از اون لازمه ابتدا ++visual C را به همراه windows sdk نصب کنید. در صورتی که نصب windows sdk با مشکل مواجه شد ابتدا از کنترل پنل این دو برنامه رو حذف کرد:

Microsoft Visual C++‎ 2010 x86 Redistributable
Microsoft Visual C++‎ 2010 x64 Redistributable
بعد از این میشه windows SDKs رو نصب کرد. بعد هم نصب کامپایلر Mex با کدی که در بالا نوشته شده. بعد میشه دوباره ورژن جدید ++C نصب کرد و به تنظیمات قبل برگشت.
حالا نوبت نوشتن و یا تبدیل کد متلب به کد زبان C یا C++ ست. به دو طریق میشه Mex File رو ایجاد کرد. روش اول اینه که با استفاده از محیط متلب و یا C++ تابعی که در واقع گلوگاه برنامه ما و زمانبر هست رو خودمون به صورت دستی بنویسیم که این کار نیاز به آشنایی به سینتکس های زبان C یا C++ داره که با توجه به اینکه زبان متلب شبیه این دو زبان هست کار سختی نیست. مشکل این روش خطایابی اون هست که کمی مشکله. با Mex File می تونید از توابع دیگه در متلب ورودی دریافت کنید و یا خروجی Mex File رو به توابع دیگه در متلب بدهید. برای این کار لازمه بلد باشید با چه دستوری یک متغیر یا پارامتر رو به عنوان ورودی دریافت کنید و با چه دستوری خروجی رو به توابع دیگه ارسال کنید. در لینک زیر با همه این دستورات آشنا میشید. (نیاز به ف ی ل ت ر ش ک ن)
http://www.shawnlankton.com/2008/03/getting-started-with-mex-a-short-tutorial/
اما یه راه خیلی ساده تر هم وجود داره اینکه از طریق برنامه متلب خیییییلی راحت کد نوشته شده رو تبدیل به Mex file کنید و راحت اون رو اجرا کنید. تقریبا بدون هیچ دردسری! در ویدئویی که لینکش رو می زارم خیلی راحت میتونید این کارو انجام بدید. تنها با دیدن چند دقیقه ابتدایی و چند دقیقه انتهایی میتونید کد متلب رو به Mex File تبدیل کنید. (نیاز به ف ی ل ت ر ش ک ن)
http://www.youtube.com/watch?v=IZJ-IlI3QR0
استفاده از Mex File به طور چشمگیری سرعت اجرای برنامه رو بالا می بره. در تجربه من زمان اجرای یک برنامه رو از 7 دقیقه به 4 ثانیه، همون مسئله در ابعاد بزرگتر از 45 دقیقه به 9 ثانیه (!) کاهش داد و باز همون مسئله در ابعاد خیلی بزرگتر که قبل از استفاده از Mex File بعد از 5 ساعت به هیچ جوابی نرسیده بودم بعد از استفاده از Mex File ، بعد از 45 دقیقه به جواب آخر رسیدم.