افزایش سرعت مطلب

زهرا1365

عضو جدید
تكنيك هاي افزايش سرعت 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 می توانید با او تماس بگیرید.
مشخصات مترجم
مهدی پاشائی، دانشجوی مهندسی برق مقطع کارشناسی
 

Similar threads

بالا