یک مهندس ICT

مطالب درسی و مقالات مربوط به فناوری ارتباطات و اطلاعات را می توانید اینجا بیابید .

یک مهندس ICT

مطالب درسی و مقالات مربوط به فناوری ارتباطات و اطلاعات را می توانید اینجا بیابید .

تکنیک های افزایش سرعت در Matlab

تکنیک های افزایش سرعت Matlab شامل روش هایی چون آنالیز عملکرد برنامه، بردارسازی و تبدیل کد های Matlab به فایل های MEX می شود.

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

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

تکنیک های افزایش سرعت در Matlab

تکنیک های افزایش سرعت Matlab شامل روش هایی چون آنالیز عملکرد برنامه، بردارسازی و تبدیل کد های Matlab به فایل های MEX می شود.

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

این مقاله به مرور روش های افزایش سرعت نرم افزار 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 بجای این حلقه، این قسمت را بردارسازی نمود. این تغییر ساده سرعت اجرای کلی برنامه را دو برابر افزایش می دهد.


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 دارای زمان اجرای s 2.7 می باشد.




تصویر بالا نشان می دهد گه چگونه فایل های MEX سرعت اجرای الگوریتم مثال بالا را تقریباً ده برابر افزایش داده است.

درباره ی مؤلف:

لوک سیمریا مدیر محصولات شرکت Catalytic می باشد. پیش از آن، پست هایی در شرکت Synopsys داشته است. موضوعات تحقیقی مورد علاقه ی وی شامل کامپایلرها، ابزار EDA، معماری کامپیوتر، و الگوریتم های DSP می باشد. او مدرک Ph.D خود را در مهندسی برق از دانشگاه استنفورد گرفته است. با استفاده از آدرس luc@catalyticinc.com می توانید با او تماس بگیرید.

نظرات 0 + ارسال نظر
برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد