بر روی لینک های زیر کلیک نمایید
- دانلود رایگان کد های آماده MATLAB
- دانلود رایگان فیلم های آموزشی الگوریتم های بهینه سازی ، شبکه عصبی ، منطق فازی و ...
- انجام پروژه های برنامه نویسی MATLAB
- تدریس خصوصی ، دوره های آموزشی الگوریتم های بهینه سازی ، شبکه عصبی ، منطق فازی و ...
- دانلود رایگان فایل های آموزشی
بررسی اجمالی
در این پست، ما ابتدا اصول اولیه استفاده از GPU با MATLAB را بیان و سپس به سمت حل معادله موج مرتبه 2 با استفاده از این قابلیت GPU حرکت می کنیم. از آنجا که نسخه ی نمایشی ساخته شده بود، توابع GPU موجود در MATLAB افزایش یافته است.قابلیت GPU نشان داده شده در این پست به جعبه ابزار محاسبات موازی (Parallel Computing Toolbox) احتیاج دارد.
سابقه و هدف GPU
GPU در اصل برای سرعت بخشیدن به اجرای (rendering) گرافیک استفاده می شود، GPU ها در حال حاضر به طور فزاینده در محاسبات علمی به کار روند. بر خلاف پردازنده های (CPUهای) قدیمی، که دارای تعداد انگشت شماری هسته اند، یک GPU تعداد بسایر زیادی آرایه ی موازی از صحیح و ممیز شناور پردازندهها دارد، همچنین حافظه اختصاص داده شده، با سرعت بالا است. GPU به طور معمول شامل صدها پردازنده از این پردازنده های کوچک است. این پردازنده ها می توانند تا حد زیادی برای افزایش سرعت انواع خاصی از برنامه های کاربردی استفاده شوند.
یک قاعده سرانگشتی مناسب این است که مسئله شما ممکن است برای GPU مناسب باشد، اگر چنین باشد:
Massively parallel: محاسبات می تواند به صدها یا هزاران واحدهای مستقل از هم شکسته شود. شما بهترین کارایی را زمانی خواهید دید که همه هسته ها به کار گرفته شده اند (بهره گیری از خاصیت موازی بودن ذاتی GPU). به ظاهر ساده، محاسبات vectorized MATLAB روی آرایه با صدها هزار عنصر را اغلب می توان در این دسته جا داد.
Computationally intensive (محاسباتی فشرده): زمان صرف شده در محاسبات به طور قابل توجهی بیش از زمان صرف شده در انتقال اطلاعات به (از) حافظه GPU است. از آنجا که پردازنده گرافیکی (GPU) از طریق باس PCI Express به پردازنده میزبان (Host CPU) متصل شده، دسترسی به حافظه کندتر از CPU قدیمی است. این به این معنی است که به طور کلی افزایش سرعت محاسباتی با میزان انتقال داده ها محدود شده است که در الگوریتم شما جای می گیرد.
برنامه های کاربردی که این معیارها را ایفا نمی کنند ممکن است در عمل بر روی یک GPU نسبت به یک CPU کندتر اجرا شوند.
آنچه ما در مورد GPU یاد می گیریم
با این زمینه، ما اکنون می توانیم کار با GPU در MATLAB را شروع کنیم.اجازه دهید با بررسی GPU مورد نظرمان تنها برای مشاهده آنچه با آن کار می کنیم، شروع کنیم:
gpuDevice
ans =
parallel.gpu.CUDADevice handle
Package: parallel.gpu
Properties:
Name: 'Tesla C2050 / C2070'
Index: 1
ComputeCapability: '2.0'
SupportsDouble: 1
DriverVersion: 4
MaxThreadsPerBlock: 1024
MaxShmemPerBlock: 49152
MaxThreadBlockSize: [1024 1024 64]
MaxGridSize: [65535 65535]
SIMDWidth: 32
TotalMemory: 3.1820e+009
FreeMemory: 2.6005e+009
MultiprocessorCount: 14
ClockRateKHz: 1147000
ComputeMode: 'Default'
GPUOverlapsTransfers: 1
KernelExecutionTimeout: 1
CanMapHostMemory: 1
DeviceSupported: 1
DeviceSelected: 1
ما یک Tesla C2050 را دنبال می کنیم.در حال حاضر، جعبه ابزار محاسبات موازی(Parallel Computing Toolbox) از GPUهای NVDIA با قابلیت محاسبه 1.3 یا بالاتر پشتیبانی می کند.
یک مثال ساده با استفاده از توابع غیرمنتظره (Overloaded Functions)
بیش از 100 نوع عملیات (به عنوان مثال FFT، IFFFT، EIG) در حال حاضر به عنوان توابع ساخته شده در MATLAB در دسترس هستند که می توانند به طور مستقیم بر روی پردازنده گرافیکی (GPU) با ارائه یک آرگومان ورودی از نوع آرایه GPU اجرا شوند. این توابع فعال GPU یعنی (GPU-enabled functions) غیرمنتظره (overload) هستند، به عبارت دیگر، آنها متمایز از وابستگی به نوع داده آرگومان های داده شده به آنها عمل می کنند.
اجازه دهید یک آرایه GPU ایجاد و با استفاده از GPU یک FFT را اجرا کنیم.با این حال، اجازه دهید ابتدا این کار را بر روی CPU انجام دهیم تا بتوانیم تفاوت در کد و عملکرد را ببینیم:
A1 = rand(3000,3000);
tic;
B1 = fft(A1);
time1 = toc;
برای انجام عملیات مشابه بر روی GPU، ما ابتدا gpuArray را برای انتقال داده ها از فضای کاری MATLAB را به حافظه دستگاه به کار می بریم. سپس می توانیم FFT را اجرا کنیم که یکی از توابع غیرمنتظره روی آن داده است:
A2 = gpuArray(A1);
tic;
B2 = fft(A2);
time2 = toc;
مورد دوم بر روی GPU و نه روی CPU اجرا شده است چون ورودی اش (GPUArray) بر روی GPU قرار دارد. در نتیجه، B2، بر روی پردازنده گرافیکی (GPU) ذخیره شده است. با این حال، آن است که هنوز در فضای کاری MATLAB قابل مشاهده است. با اجرای کلاس (B2) ما می توانیم ببینیم که آن نیز یک GPUArray است.
class(B2)
ans =
parallel.gpu.GPUArray
برای آوردن اطلاعات به CPU، ما gather را اجرا می کنیم
B2 = gather(B2);
class(B2)
ans =
double
B2 در حال حاضر بر روی CPU است و یک کلاس از double دارد.
افزایش سرعت کارکرد برای مثال ساده ما
در این مثال ساده، ما می توانیم افزایش سرعت اجرای FFT بر روی داده های خود را محاسبه کنیم.
speedUp = time1/time2;
disp(speedUp)
3.6122
به نظر می رسد مانند FFT ما روی پردازنده گرافیکی تقریبآ 3.5 برابر سریعتر در حال اجرا است این بسیار خوب است، به ومخصوصآ چون FFT در هسته MATLAB چند رشته (multi-threaded) است. با این حال، برای انجام یک مقایسه واقعی، ما واقعا باید زمان صرف انتقال بردار به (و از) GPU را در نظر بگبریم. اگر ما این کار را انجام دهیم، پی می بریم که شتاب ما تا حد زیادی کاهش می یابد. بیایید ببینیم که اگر ما زمان را برای انجام انتقال داده هایمان در نظر بگیریم، چه اتفاقی می افتد.
tic;
A3 = gpuArray(A1);
B3 = fft(A3);
B3 = gather(B3);
time3 = toc;
speedUp = time1/time3;
disp(speedUp)
0.5676
درک و محدود کردن انتقال سرجمع (Overhead) داده های شما
انتقال سرجمع داده (Data transfer overhead) می تواند خیلی مهم باشد چون اجرای کلی برنامه کاربردی را تنزل می دهد، به خصوص اگر شما بارها و بارها بین CPU و GPU برای اجرای تعداد نسبتآ کمی عملیات محاسباتی فشرده تبادل داده کنید. با این حال همه امید از دست نرفته است! با محدود کردن انتقال اطلاعات بین GPU و CPU، ما هنوز هم می توانیم به سرعت کارکرد بالا دست یابیم.
به جای ایجاد داده ها در CPU و انتقال آن به GPU، ما می توانیم مستقیمآ بر روی GPU داده را ایجاد کنیم. بیایید ببینید که اثرات زمان ما چگونه است. برای دقیق بودن، ما همچنین باید کد اصلی سریال از جمله زمان لازم برای تولید ماتریس تصادفی بر روی پردازنده retime کنیم.
tic;
A4 = rand(3000,3000);
B4 = fft(A4);
time4 = toc;
tic;
A5 = parallel.gpu.GPUArray.rand(3000,3000);
B5 = fft(A5);
B5 = gather(B5);
time5 = toc;
speedUp = time4/time5;
disp(speedUp);
1.4100
این بهتر است، اگر چه ما هنوز هم نفوذ جمع آوری داده ها از پردازنده گرافیکی را می ببینیم. در این نسخه ی نمایشی ساده، اثر اغراق آمیز است زیرا ما در حال اجرای عملیات سریع در GPU هستیم. این برای انجام عملیات مختلف بر روی داده ها تا زمانی که بر روی GPU باشد و آوردن اطلاعات CPU تنها زمانی که مورد نیاز است، کار آمدتر است.
حل معادله موج
در مثال بالا برای قرار دادن متن، اجازه دهید از قابلیت یکسان GPU در "دنیای واقعی" مسئله استفاده کنیم. برای این کار، ما می خواهیم برای حل معادله موج مرتبه دوم:
الگوریتمی که ما برای حل معادله موج به کار می بریم ترکیبی از روش طیفی در فضا و یک روش تفاضل متناهی مرکزی مرتبه دوم در زمان است. به طور خاص، ما روش طیفی چبیشف را به کار می بریم، که با استفاده از چند جمله ای های چبیشف به عنوان توابع پایه ای است.
تغییر کد برای اجرای الگوریتم بر روی GPU
در هنگام شتاب الگوریتم ما، ما روی بالا بردن سرعت کد در مدت زمان اصلی پله while-loop تمرکز می کنیم. عملیات در بخشی از کد (به عنوان مثال FFT و ifft، ضرب ماتریس) همگی توابع غیرمنتظریه (overloaded functions) هستند که با GPU کار می کنند. در نتیجه، ما نیازی به تغییر الگوریتم در هر راه برای اجرا بر روی GPU نداریم. ما به سادگی انتقال داده ها را به GPU و به CPU زمانی که به پایان رسید، می رسیم.
به دلیل طولانی شدن متن، ادامه ی مقاله در پست بعدی درج خواهد شد...
,pareto front,particle swarm optimization,partitioning clustering methods,path planning,pattern mining,pattern recognition,pca,pca غیر خطی,pesa,pesa-ii,pid,pid controller,pid controler in matlab,pid controler in متلب,pid controler in مطلب,point detection,pole assignment,popup menu,portfolio management,portfolio optimization,principal component analysis,project scheduling,property,pso,pso استاندارد پیوسته,pso چند هدفه,pso گسسته باینری,pso traveling salesman problem,pso travelling salesman problem,qap,quadprog,quadratic assignment problem,radial basis function,rbf,rcpsp,reference type,register transfer logic,regression,regular expressions,regularized filtering,reliability,resource allocation,response surface method,rsm,rtl,rule mining,sce-ua,scheduling,scm,self-organizing maps,sfla,sfla استاندارد,shufflee,shuffled frog leaping algorithmm,signal processing