استفاده از CUDA در MATLAB (قسمت اول)

نرم‌افزار Matlab با توجه به دستورها و توابع ساده و محیط داده‌ای برداری‌ای که در بر دارد، یکی از بهترین و کاراترین نرم افزارها برای کاربرانی است که دانش عمیقی از برنامه نویسی ندارند و نیاز دارند تا وقت و زمان خود را صرف آزمایش طرح‌های جدید و پیش نمونه‌سازی الگوریتم‌های جديد كنند. پس از معرفی CUDA و فراهم شدن امکان استفاده از قدرت GPU در محاسبات، دو ابزار مناسب برای بهره‌برداری از این توانايي‌ها در محیط Matlab معرفی شدند و در زمینه حل مسائل سنگین ریاضی و فیزیک در شاخه‌های مختلف علوم از جمله مهندسی و پزشکی تحولی شگرف پدید آوردند. این ابزارها GPUmat و Jacket نام دارند که اولی ابزاری رایگان بوده و به سهولت قابل تهیه است. در نقطه مقابل، ابزار Jacket رایگان نيست و در عین حال، امکانات و قابلیت‌های بسیار بهتر و مناسب‌تری دارد. در این مقاله به بررسی قابلیت‌های معرفی شده توسط Jacket می‌پردازیم.

معرفی JACKET و قابلیت پردازش توزیع یافته
همان‌گونه که در مقالات بخش‌های قبل نیز مورد بحث و بررسی قرار گرفت‌، پردازنده‌های گرافیکی به دلیل ماهیت ساختاری و هدفی که دنبال مي‌كنند‌، توانایی‌های فوق‌العاده‌ای در زمینه پردازش‌موازی ومحاسبات ممیز شناور (Flooting Point)  دارند و به دلیل برخورداری از هسته‌های پردازشی بیشتر با معماری بهینه‌سازی شده برای محاسبات موازی‌، در بسیاری از موارد قدرت محاسباتی بالاتری نسبت به CPU  ارائه می‌دهند. شكل 1 نمونه‌ای از تفاوت معماری‌های CPU و GPU را نشان می‌دهد. نموداری برای مقایسه قدرت محاسباتی پردازنده‌های عادی و گرافیکی ارائه شده است.

 

matlab1_s.jpg

شکل 1


مطابق بررسي‌هاي انجام‌شده‌، قدرت محاسباتی یک پردازنده گرافیکی تسلا‌، چیزی بالاتر از پانصد برابر قدرت یک پردازنده چهار هسته‌ای اینتل است. به این نکته توجه داشته باشید که پردازنده‌های گرافیکی به دلیل معماری خاص و هدف یگانه‌ای که دارند از چنین توانایی‌هایی برخوردار بوده و معماری آن‌ها برای پیاده‌سازی یک CPU مناسب نیست. زيرا با توجه به معماری کنونی پلتفرم x86، دستگاه‌ها و تجهیزات مختلفی در سیستم موجود هستند که مدیریت آن‌ها بر عهده پردازنده بوده و برای حفظ ارتباطات مناسب و مدیریت جامع، CPU ناگزیر از داشتن چنین معماری و به تبع آن پردازش کندتری است. با توجه به مطالب ذکر شده و مفاهیم پایه‌ای موازی‌سازی، پردازنده‌های گرافیکی را مي‌توان پردازنده‌هايي بهینه‌ شده در راستای موازی‌سازی وظايف (Task Parallelism) و داده‌ها (Data Parallelism) دانست.


 قدرت محاسبات قوی ریاضی GPU آن را برای استفاده در محاسبات داده‌های با حجم بالا چون پردازش تصویر و ویدیو، کدگذاری و کدگشایی تصاویر و تشخیص الگو بسیار کارا كرده است. این کارایی باعث شد تا فناوری‌هایی برای استفاده از قدرت GPU در محاسباتي خارج از بازی‌ها پا به عرصه وجود بگذارند و محصولات مختلفی بر پایه آن‌ها روانه بازار شود. فناوری CUDA از شرکت Nvidia نخستين و موفق‌ترین فناوری این‌چنینی است که مفاهیم جدید بسیاری را در افزایش سرعت محاسبات با کاربردهای مختلف بر پایه استفاده از GPU مطرح كرده است. برای استفاده از پلتفرم CUDA و برنامه‌نویسی برای استفاده از قدرت GPU، محصولات مختلفی تولید و عرضه شده‌اند که عموماً در راستای توسعه کد در محیط‌های برنامه‌نویسی پیشرفته به‌کار مي‌روند. با این حال، کاربران بسیاری در محیط‌های علمی صنعتی وجود داشتند که لازم بود بدون داشتن دانش کافی در برنامه‌نویسی پیشرفته، بتوانند از قدرت محاسباتی GPU و امکانات CUDA استفاده كرده و سرعت محاسبات خود را در زمینه‌های تحقیقاتی افزایش دهند.


 برای رفع این نیاز، شرکت AccelerEyes با توسعه یک رابط مناسب با نام Jacket برای نرم‌افزار Matlab امکان استفاده از فناوری CUDA را در یکی از پرکاربردترین نرم‌افزارهاي حوزه‌هاي تحقیقات، محاسبات مهندسی و پردازش‌های علمی فراهم كرده است. با استفاده از قابلیت‌های مناسب Matlab در زمینه پردازش داده‌های با حجم بالا بر مبنای زبان برداری مختص خود، کاربران بسیاری در حوزه‌های ذکر شده، مي‌توانند با سهولت هرچه تمام‌تر به توسعه Prototype الگوریتم‌ها پرداخته و محاسبات مختلف علمی را با سرعت بیشتری انجام دهند. رابط Jacket با معرفی چند Data Type جدید در Matlab و توابعی خاص برای کار با آن‌ها، تبدیل کدهای نوشته شده برای CPU به نوع مناسب GPU را بسیار ساده كرده و کاربر به سادگی مي‌تواند با استفاده از همان مفاهیم قبلی، اسکریپت‌های جدیدی بر مبنای GPU بنویسد.

 

یکی از این تمهیدات، استفاده از نام انواع داده‌ و توابع به همراه پیشوند g است که تغییر در کد را بسیار ساده و آسان كرده است. با این‌که استفاده از نوع داده‌ای gsingle برای GPU در مقابل نوع داده‌ای Single با استفاده از Jacket بسیار ساده است، اما میزان بسیار زیادی از اتفاقات در پس زمینه رخ داده و Jacket وظیفه انجام تبدیل و انتقال داده‌ها به GPU را بر‌عهده مي‌گیرد. رابط Jacket بزرگ‌ترین مجموعه توابع پیش ساخته را برای استفاده روی GPU دارد. مجموعه غنی این توابع از توابع ساده‌ای چون SUM و SIN آغاز شده و توابع پیچیده‌ای چون INV، SVD، BESSELJ و FFT را شامل مي‌شود. همچنین، برای حفظ ماهیت اسکریپتی و مفسری زبان M، Jacket از کامپایلر GPU به صورت بي‌درنگ و Transparent استفاده مي‌كنند تا داده‌ها و توابع با انواع مناسب با ساختار GPU همخوانی داشته باشند.


علاوه بر امکانات فوق، ابزارهای گرافیکی يكپارچه منحصر به فردي در این رابط در نظر گرفته شده است تا امکان نمایش و ارائه‌گرافیکی داده‌های GPU به صورت مستقیم برای کاربر امکان پذیر باشد. به همین دلیل، مشاهده نتایج محاسبات هنگام انجام عملیات پردازش، ساده و سریع بوده و به تبدیل داده‌ها به انواع CPU محور و سپس نمایش آن‌ها نيازي وجود ندارد. فرمان‌های GSURF، GIMAGE و GVOLUM نمونه‌ای از این ابزارها هستند. یکی دیگر از امکانات عالی و بسیار سودمند Jacket، ارائه یک SDK برای توسعه نرم‌افزارها بر مبنای این رابط است. مهم‌ترین جزء موجود در این SDK، کامپایلر Jacket است که امکان کامپایل کد M توسعه داده شده در Matlab را به صورت برنامه‌های اجرایی مستقل فراهم مي‌سازد. با استفاده از این کامپایلر، همانند کامپایلر موجود در Matlab، کاربر مي‌تواند برنامه‌های کاربردی مستقلی ایجاد کرده و عرضه كند که از قدرت محاسباتی Matlab و امکانات عالی CUDA و GPU به صورت یک‌جا استفاده مي‌كند. شكل 2 نمایی از معماری Jacket را نشان مي‌دهد.

matlab2_s.jpg

شکل 2

 

 

دریافت JACKET، کاربردها
برای دریافت آخرین نسخه Jacket مـــي‌توانیــــد بــــه قسمــت دانلـــودها در سایــت شــرکت AccelerEyes بـــه آدرس http://www.accelereyes.com/downloadJacket مراجعه كنيد. در این قسمت، امکان دانلود نسخه‌های مختلف Jacket برای پلتفرم‌های مختلف ویندوز، لینوکس و مك نیز وجود دارد. پس از دانلود نسخه ویندوزی با حجم تقریبی 120 مگابایت و اجرای آن، یک ویزارد نصب آغاز شده و سیستم را آماده نصب Jacket مي‌كنند. در حین نصب این ابزار، برنامه نصب کننده روی سیستم، به دنبال درایورهای مرتبط با CUDA مي‌گردد. در صورتی که درایور مناسبی یافت نشود، امکان دانلود درایور مناسب از طریق یک دکمه فراهم مي‌شود.پس از پایان فرآیند نصب، برنامه فعال‌سازی مجوز نرم افزار اجرا شده و یک حساب کاربری برای اتصال به AccelerEyes درخواست مي‌كند. پس از اتصال به AccelerEyes، امکان انتخاب مجوزهاي مختلف وجود دارد. مجوزهاي قابل سفارش برای نرم‌افزار از طریق قسمت مدیریت مجوزها در سایت شرکت با آدرس http://www.accelereyes.com/licenses قابل تنظیم هستند. در این قسمت مي‌توانید یک مجوز آزمایشی (trial) سفارش دهید.

شروع کار با JACKET
پس از نصب موفقیت‌آمیز Jacket روی سیستمی که قبلاً نرم‌افزار Matlab روی آن نصب شده است، توابع و ساختار‌های داده‌ای مبتنی بر GPU آماده استفاده خواهند بود. نخستين گام در استفاده از Jacket، تبدیل داده‌های مبتنی بر CPU به نوع منطبق با GPU است. این کار داد‌ه‌ها را در فضای حافظه کارت گرافیکی ایجاد کرده و آماده کار مي‌کند. جدول 1 فهرستی از توابع Jacket را برای تبدیل یا ایجاد داده‌ها در GPU نمايش مي‌دهد.

matlabt1_s.jpg

جدول 1


پس از آن‌که داده‌های مورد نیاز به نوع مبتني بر GPU تعریف یا تبدیل شدند، عملیاتی که روی آن‌ها انجام خواهد شد، در GPU اتفاق خواهد افتاد. در‌صورتی که نیاز به بازگردانی داده‌ها به نوع CPU محور باشد یا این‌که لازم باشد تا عملیات روی داده‌ها در CPU ادامه یابد، باید با استفاده از توابع استاندارد Matlab آن‌ها را تبدیل كرد. به عنوان مثال، در صورتی که نیاز باشد از یک ماتریس Double تعریف شده در GPU در CPU استفاده كرد، باید با استفاده از کد B=double(A); ماتریس CPU محور B را تولید کرده و عملیات را روی آن انجام داد. پس از تولید داده‌ها، یکی از مهم‌ترین نیازها استفاده از توابع زمان‌سنجی جهت ارزیابی سرعت پردازش و کارایی پردازنده گرافیکی است. در محیط استاندارد Matlab برای سنجش زمان اجرای عملیاتی خاص از توابع Tic و Toc استفاده مي‌شود. روش استفاده از این توابع به این‌گونه است که برای آغاز سنجش زمان در ابتدای کد از تابع Tic استفاده کرده‌، سپس برای پایان سنجش زمان اجرا، در پایان کد از تابع Toc استفاده مي‌كنند. خروجی تابع دوم بازه زمانی اجرای کد خواهد بود. در Jacket نیز امکاناتی مشابه برای سنجش زمان اجرا در GPU در قالب توابع gsync و geval در نظر گرفته شده است که کارکردی مشابه با Tic/Toc دارند.

matlab3_s.jpg

شکل 3 

 

matlab4_s.jpg

شکل 4

 

 

این توابع با توجه به تأخیر کلی برای آغاز اجرای فرامین در پردازنده گرافیکی، به دقت به محاسبه زمان اجرا مي‌پردازند. برای استفاده از Jacket در نرم‌افزار Matlab قبل از هر چیز باید دایرکتوری Engine موجود در مسیر نصب Jacket را به متغیر مسیر Matlab اضافه كنيد. پس از این کار استفاده از Jacket روالی بسیار ساده خواهد داشت. فهرست 1 یک برنامه ساده را بر مبنای Jacket نشان مي‌دهد. در فهرست 2 با استفاده از قابلیت‌های GPU به محاسبه عدد پی پرداخته شده است.

addpath /engine
X = gdouble( magic( 3 ) );
Y = gones( 3, ‹double› );
A = X * Y
 
A =
 
    15    15    15
    15    15    15
    15    15    15

فهرست 1

 

addpath /engine
NSET = 1000000;
X = grand( 1, NSET );
Y = grand( 1, NSET );
distance_from_zero = sqrt( X.*X + Y.*Y );
inside_circle = (distance_from_zero <= 1);
pi = 4 * sum(inside_circle) / NSET
 
pi =
 
    3.1421

فهرست 2

 

حلقه تکرار در Jacket
در محیط Matlab و با استفاده از Jacket مي‌توان با استفاده از حلقه GFOR/GEND تکرارهای مختلف و مستقلی از یک حلقه for را روی GPU اجرا كرد. همان‌طور که مي‌دانید، حلقه For به صورت استاندارد برای هر تکرار به صورت ترتیبی و سریال اجرا مي‌شود. با این حال، در محیط Jacket تکرارهای حلقه به صورت تکه تکه در آمده و تمام تکرارهای حلقه به صورت موازی و یکجا اجرا مي‌شوند. با توجه به این ساختار، این حلقه محدودیت‌های بسیاری دارد که یکی از مهم‌ترین آن‌ها استقلال هر تکرار نسبت به دیگری است. همچنين، در متن حلقه‌های تکرار GFOR امکان استفاده از عبارات شرطی وجود نداشته و همچنین، نمی‌توان عناصر یک آرایه را برای خواندن یا نوشتن در دسترس قرار داد. نکته قابل توجه آن است که با توجه به محدودیت‌های بسیار GFOR در صورتی که امکان پیاده‌سازی کد در GFOR وجود نداشته باشد مي‌توان در بدنه یک حلقه عادی از متغیرهای GPU و امکانات پردازشی آن استفاده كرد. در این حالت، افزایش سرعت کد نسبت به مدل سنتی به صورت Per-Iteration SpeedUp خواهد بود. همچنين، بهتر است تا حد امکان، کدهای نرم‌افزار بر مبنای بردارها توسعه یافته و از حلقه‌های تکرار استفاده نشود. فهرست 3 نمونه‌اي از چگونگي استفاده از GFOR  را برای ضرب ماتریس‌ها و بردارها نشان مي‌دهد.

A = gones(n);
B = gones(1,n);
gfor k = 1:n
  B(k) = A(k,:) * A(:,k);  % vector-vector multiply
gend
 
A = gones(n,n,m);
[B C] = deal(gones(n));
gfor k = 1:m
  C(:,k) = A(:,:,k) * B;   % matrix-vector multiply
gend
 
A = gones(n,n,m);
B = gones(n);
gfor k = 1:m
  A(:,:,k) = A(:,:,k) * B; % matrix-matrix multiply
gend

فهرست 3


مطالب مشابه :


شبیه سازی مبدل ( چاپر ) dc به dc از نوع ( باک) buck ( حلقه باز و حلقه بسته ) در نرم افزار MATLAB

شبیه سازی پروژه های برق در MATLAB buck و به دو صورت کنترل حلقه باز و کنترل حلقه بسته در




شبیه سازی مبدل ( چاپر ) dc به dc از نوع ( چوک) Ćuk ( حلقه باز و حلقه بسته ) در نرم افزار MATLAB

شبیه سازی پروژه های برق در MATLAB Ćuk و به دو صورت کنترل حلقه باز و کنترل حلقه بسته در




شبیه سازی مبدل ( چاپر ) dc به dc از نوع ( بوست) boost ( حلقه باز و حلقه بسته ) در نرم افزار MATLAB

شبیه سازی پروژه های برق در MATLAB boost و به دو صورت کنترل حلقه باز و کنترل حلقه بسته در




ساخت حلقه در متلب با for :

مهندسی-مکانیک-mechanic-متلب-matlab-کتاب - ساخت حلقه در متلب با for : - - مهندسی-مکانیک-mechanic-متلب-matlab-کتاب




آموزش برنامه نویسی متلب - حلقه ها

حلقه ها در متلب : بزرگترین امکان رایانه ها که بیش از همه برای انسان مفید بوده است قابلیت




شبیه سازی مبدل ( چاپر ) dc به dc از نوع ( باک-بوست) buck-boost در نرم افزار MATLAB

شبیه سازی پروژه های برق در matlab ، شبیه با کنترل حلقه باز و کنترل حلقه بسته در سیمولینک




شبیه سازی کنترل سرعت موتور القایی با استفاده از روش کنترل برداری غیر مستقیم ( Indirect vector contro

شبیه سازی پروژه های برق در matlab ، شبیه سازی (حلقه باز و حلقه بسته) در نرم افزار matlab




آموزش Matlab ( جلسه 5 )

در Matlab بردارها و زیر ماتریس ها اغلب را می دهد.این بردارها عموما در حلقه های for استفاده




تولید ماتریس با با استفاده از تابع for

MATLAB - تولید من می خواستم برنامه ای بنویسم که با حلقه forتولید نوشته شده توسط فاتحی بابی در




استفاده از CUDA در MATLAB (قسمت اول)

مهندسی-مکانیک-mechanic-متلب-matlab-کتاب - استفاده از CUDA در MATLAB (قسمت اول) - - مهندسی-مکانیک-mechanic-متلب




برچسب :