آخرين ارسالهاي تالار

خطا: mod_kunenalatest:كيوننا نسخه 1.7 (يا بالاتر) بر روي سيستم شما نصب نيست!
پیغام
  • Kunena is not installed or the installed Kunena version is not supported. The plug-in has now been disabled. Please install/upgrade Kunena to version 1.7 for the Kunena Discuss Plug-in to function properly.
استفاده از GPU ها در MATLAB مشاهده در قالب PDF چاپ فرستادن به ایمیل
نوشته شده توسط admin   
چهارشنبه, 02 فروردین 1391 ساعت 23:17

بررسی اجمالی

در این پست، ما ابتدا اصول اولیه استفاده از 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 زمانی که به پایان رسید، می رسیم.

به دلیل طولانی شدن متن، ادامه ی مقاله در پست بعدی درج خواهد شد...

منبع: http://www.seeew.com

نظر ها (5)
  • omid reza  - سایر کارتهای گرافیکی
    با سلام و تشکر از مطلب جالب توجهی که ارائه نموده اید. سعی کردم که مثال شما را روی دستگاه خودم اجرا کنم ولی با پیغام خطا مواجه شدم، به نظرم رسید که ماژولهای نرم افزار متلب تنها برای کارتهای سری NVIDIA تنظیم شده است و به سایر کارتها مانند AMD Radeon HD 6550D پاسخ نمی دهد. لطفا در این خصوص برای من بیشتر توضیح دهید.
  • amir.ebrahimi66
    بله. برای این که بدونید روی چه کارت های گرافیکی کار میکنه باید به صفحه مربوط به GPU در سایت اصلی متلب برید.
  • sibooy  - فعال نشدن جکت کودا
    با سلام
    ببخشید من جکت مربوط به کودا رو دانلود کردم اما لایسنس می خواست و من هرکاری کردم نتونستم لایسنس بگیرم و جکت رو فعال کنم
    ممنون می شم کمکم کنید
  • محسن  - FFT
    سلام
    من یک اسالیسکوپ دارم که داده های ولتاژ برحسب زمان را به من می دهد که به صورت تکست می باشد که با وارد کردن این داده ها به متلب من از این داده ها FFT میگیرم که نمودارش را رسم کند.حال من می خواهم که این به صورت اتوماتیک انجام شود یعنی دیگر من داده ها را وارد نکنم خود کامپیوتر یا متلب داده ها را بگید از اسالیسکوپ و برای FFT را محاسبه کند وبیشترین و... پیک ها را بدهد.چگونه است؟
  • امیر
    متلب خودش اتوماتیک میتونه از فایل تکست بخونه. همچنین میتونید متلب رو به پورت سریال وصل کنید.
تنها کاربران عضو شده می توانند نظر ارسال کنند!
آخرین بروز رسانی در چهارشنبه, 02 فروردین 1391 ساعت 23:26
 
logo-samandehi