ورود به حساب کاربری

نام کاربری *
رمز عبور *
مرا به خاطر بسپار.

بنیاد توسعه رایانش سریع و ابری

HPC and Cloud Computing Development Foundation

استفاده از CUDA در MATLAB

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

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

 

شکل 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 را نشان مي‌دهد.

شکل 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 نمايش مي‌دهد.

جدول 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 دارند.

شکل 3  

 

شکل 4

 

 

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

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

فهرست 1

 

addpath <jacket_root>/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

گرافیک در JACKET
همان‌طور که قبلاً اشاره شد، توابع گرافیکی مناسبی برای نمایش داده‌های GPU به صورت مستقیم در Jacket در نظر گرفته شده است که در نوع خود منحصر به فرد بوده و کاربردهای بسیار خوبی دارند. یکی از این توابع، تابع GPlot است که برای کشیدن نمودارهای دو بعدی (همانند Plot در Matlab) به‌کار مي‌رود. فهرست 4 برنامه‌ای نمونه برای استفاده از GPLOT را در بر دارد. شكل 3 خروجی این برنامه را نشان مي‌دهد. توجه كنيد که برای استفاده از Gplot باید مسیر m فایل gplot در Jacket را به مسیر اجرایی Matlab اضافه كنيد.  یکی دیگر از توابعی که برای نمایش داده‌های GPU در Jacket کاربرد دارد، تابع GSURF است که کاربردی مشابه تابع SURF استاندارد دارد. این تابع یک ماتریس دو بعدی و نرمالایز شده را به‌عنوان ورودی دریافت کرده و به صورت یک نمودار سطحی نمایش مي‌دهد. فهرست 5 برنامه‌ای را برای استفاده از GSURF ارائه مي‌كند. خروجی این برنامه در شكل 4 به نمایش درآمده است. به طور کلی، مي‌توان با استفاده از فرمان GFIGURE یک تصویر در فضای GPU تولید کرده و محتوای آن را به دلخواه تعیین كرد. فرمان GFIGURE از لحاظ کاربرد مشابه فرمان FIGURE در محیط Matlab عمل مي‌كند. در فهرست 6 برنامه‌ای برای رسم یک کره چرخان با استفاده از OpenGL در فضای GPU ارائه شده است. خروجی این برنامه را در شكل‌‌5 مشاهده مي‌كنيد.

<jacket_root>/gfx/gplot.m
A = randn( 1, 100 );     % Initialize a random vector
A = A + abs( min( A ) ); % Rescale the data to [0 1] range
A = A ./ max( A(:) );
gplot( gdouble( A ) );   % Display random image.

فهرست 4

addpath <jacket_root>/gfx
addpath <jacket_root>/gfx/mgl
Z = peaks( 30 );          % Generate surface data
Z = Z + abs(min( Z(:) )); % Rescale data in the [0 1] range
Z = Z ./ max( Z(:) );
gsurf( gdouble ( Z ) );   % Display the surface mesh.

فهرست 5

 

addpath <jacket_root>/gfx
addpath <jacket_root>/gfx/mgl
gfigure;
quadratic=gluNewQuadric();
gluQuadricNormals(quadratic, GLU_SMOOTH);
gluQuadricDrawStyle(quadratic,GLU_LINE);
gluQuadricTexture(quadratic, GL_TRUE);
for i=1:10000
  % Do some OGL so that we see something
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();
  glTranslatef(0, 0.0, -6.0);
  glRotatef(i/20,0,0.5,0.2);
  glColor3f(1.0, 0.0, 0.0);
  gluSphere(quadratic,2,32,32);
  glXSwapBuffers;
end

فهرست 6

شکل 5

 

ارزیابی
پس از آشنایی با مفاهیم کلی استفاده از قابلیت‌های Jacket و توان پردازشی GPU، نوبت آن مي‌رسد تا مزایای استفاده از پردازنده گرافیکی در محاسبات و میزان کارایی آن را در مقابل CPU ارزیابی كنيم. برای این کار، مشابه با آنچه در «مقاله پردازش‌موازی با Matlab» انجام داده‌ایم، در یک برنامه تابعی برای انجام محاسبات سنگین نوشته و دو نمونه از آن را روی CPU و GPU اجرا کرده و زمان‌های اجرا را محاسبه مي‌كنيم. با مقایسه این زمان‌ها، مي‌توان به دید مناسبی از کارایی GPU نسبت به CPU دست یافت. فهرست 7  یک تابع  را برای انجام محاسبات سنگین روی CPU یا GPU  در بر دارد. فهرست 8  فایل استفاده کننده از این تابع را نشان مي‌دهد.  خروجی این برنامه مشابه آنچه در مقاله پردازش موازی با Matlab در همین شماره ارائه شده، در فهرست 9 آورده شده است. همان‌طور که مي‌بینید، افزایش سرعت یک پردازنده گرافیکی نسبت به یک پردازنده عادی بسیار خوب و حدود 26 برابر است. با این حال، استفاده از دو پردازنده گرافیکی باعث شده تا سرعت محاسبات کاهش یابد. به اين دلیل که این برنامه روی سیستمی اجرا شده است که از دو کارت گرافیک 9400 و 9600 شرکت nVIDIA بهره مي‌برده است.

function [ T ] = multibenchNLN( Ain, E )
%multibenchNLN Benchmark based on use of non-linear processing.
 
%% SET UP VARIABLES
Msz = size(Ain,1);
 
if strcmp(class(Ain),›gsingle›), % If GPU, predefine GPU variables
    a = gzeros(Msz,1,›single›);
    R = gzeros(Msz,1,›single›);
    k1 = gsingle(pi/4);
    k2 = gsingle(pi/5);
    A = gsingle(Ain);
    geval(a,R,k1,k2,A);
else                             % If CPU, predefine CPU variables
    a = zeros(Msz,1,›single›);
    R = zeros(Msz,1,›single›);
    k1 = single(pi/4);
    k2 = single(pi/5);
    A = single(Ain);
end
 
%% PERFORM COMPUTATIONS - HERE ONLY THE EXECUTION TIME IS PASSED BACK
gsync;
tstart = tic;
parfor e=1:E
    a = A(:,e);                      % Extract vector from matrix data
    R = k2*a - k1.^2*a.^2 ...
        + k2.^2*a.^3 - k1.^3*a.^4 ...
        + k2.^4*a.^5 - k1.^5*a.^6 ...
        + k2.^7*a.^7 - k1.^8*a.^8 ...
        + k2.^9*a.^9 - k1.^10*a.^10 ...
        + k2.^11*a.^11 - k1.^12*a.^12 ...
        + k2.^13*a.^13 - k1.^14*a.^14 ...
        + k2.^15*a.^15 - k1.^16*a.^16 ...
        + k2.^17*a.^17 - k1.^18*a.^18 ...
        + k2.^19*a.^19 - k1.^20*a.^20;
    geval(a,R);                      % Force computations - does no harm for CPU
end
gsync;
T = toc(tstart);
 
end

فهرست 7

%% multibench - benchmarking script to test Jacket with PCT
clear all;
NLNcols = 2^20;
% Number of frames
E = 16;
% Set number of workers
noWorkers = 2;
% Create reference matrix
Aref = rand(NLNcols,E);
%% SINGLE WORKER CPU
if matlabpool(‘size’) > 0
    matlabpool close force;
end
% Input matrix
A = Aref;
% Define CPU variables
[~] = multibenchNLN( A, 4 );
[~] = multibenchNLN( A, 4 );
T_single_CPU = multibenchNLN( A, E );
%% SINGLE WORKER GPU
% Input matrix
A = gsingle(Aref);
% Define GPU variables
[~] = multibenchNLN( A, 4 );
[~] = multibenchNLN( A, 4 );
T_single_GPU = multibenchNLN( A, E );
%% MULTI WORKER CPU
isOpenCorr = matlabpool(‘size’) == noWorkers;
if ~isOpenCorr,
    matlabpool close force
    matlabpool(noWorkers)
end
% Input matrix
A = Aref;
% Define CPU variables
[~] = multibenchNLN( A, 4 );
[~] = multibenchNLN( A, 4 );
T_multi_CPU = multibenchNLN( A, E );
%% MULTI WORKER GPU
% Reference matrix
A = gsingle(Aref);
 % Perform test and clear reference matrices
[~] = multibenchNLN( A, E );
[~] = multibenchNLN( A, E );
T_multi_GPU = multibenchNLN( A, E );
clear Aref;
%% PRINT DATA
fprintf(‘=============================================\n’);
strCPU1 = ‘# Workers: %d  ->   CPU Time [s]:     %8.3f\n’;
fprintf(strCPU1, 1, T_single_CPU);
strGPU1 = ‘# Workers: %d  ->   GPU Time [s]:     %8.3f\n’;
fprintf(strGPU1, 1, T_single_GPU);
 
strCPU1 = ‘# Workers: %d  ->   CPU Time [s]:     %8.3f\n’;
fprintf(strCPU1, noWorkers, T_multi_CPU);
strGPU1 = ‘# Workers: %d  ->   GPU Time [s]:     %8.3f\n’;
fprintf(strGPU1, noWorkers, T_multi_GPU);
str = ‘Speed-up; 1-CPU / M-CPU [-]:         %8.3f\n’;
fprintf(str, T_single_CPU/T_multi_CPU);
str = ‘Speed-up; 1-GPU / M-GPU [-]:         %8.3f\n’;
fprintf(str, T_single_GPU/T_multi_GPU);
str = ‘Speed-up; 1-GPU / 1-CPU [-]:         %8.3f\n’;
fprintf(str, T_single_CPU/T_single_GPU);
str = ‘Speed-up; M-GPU / M-CPU [-]:         %8.3f\n’;
fprintf(str, T_multi_CPU/T_multi_GPU);
fprintf(‘=============================================\n’);

فهرست 8

 

>> multibench
Did not find any pre-existing parallel jobs created by matlabpool.
 
Starting matlabpool using the ‹local› configuration ... connected to 2 labs.
=============================================
# Workers: 1  ->   CPU Time [s]:       58.992
# Workers: 1  ->   GPU Time [s]:        2.245
# Workers: 2  ->   CPU Time [s]:       30.837
# Workers: 2  ->   GPU Time [s]:        2.374
Speed-up; 1-CPU / M-CPU [-]:            1.913
Speed-up; 1-GPU / M-GPU [-]:            0.946
Speed-up; 1-GPU / 1-CPU [-]:           26.278
Speed-up; M-GPU / M-CPU [-]:           12.989
=============================================
>>

فهرست 9

 

با این‌که قدرت پردازشی کارت 9600M چیزی حدود دو برابر کارت 9400M است، اما تقسیم مساوی و 50,50 داده‌ها و پردازش بر روی این دو منجر به کاهش سرعت پردازش شده است. برای دستیابی به سرعت بالاتر و مناسب‌تر هنگام استفاده از چند پردازنده‌گرافیکی، روش‌های مختلفی وجود دارد که برای مطالعه بیشتر مي‌توانيد بخش «منابع و مأخذ» را مشاهده كنيد.

جمع­‌بندی
در مقاله حاضر به معرفی یک ابزار مناسب و سودمند در رابطه با استفاده از قدرت پردازشی GPU در محیط کاربر پسند و ساده نرم‌افزار Matlab که یکی از پرکاربرد‌ترین نرم‌افزارها در حوزه محاسبات علمی، فنی و مهندسی است، پرداختیم. این ابزار قابلیت‌های خوبی درباره تبدیل و انتقال داده‌ها روی GPU و نمایش داده‌های GPU به‌صورت مستقیم داشته و با فراهم‌سازی امکاناتی چون کامپایلر اختصاصی برای تولید فایل‌های اجرایی مستقل از Matlab انعطاف بسیار بالایی برای کاربران خود به ارمغان مي‌آورد.

 

منبع : ماهنامه شبکه