CUDA Programming Applications

کاربردهای برنامه نویسی کودا

CUDA Programming Applications

کاربردهای برنامه نویسی کودا

پروفسور حمیدرضا تیزهوش

پروفسور حمیدرضا تیزهوش استاد دانشکده مهندسی واترلو از سال 2001 هستند و ایشان سرپرستی آزمایشگاهKnowledge Inference in Medical Image Analysis
را به عهده دارند.و بعنوان محقق در آزمایشگاه سیستمهای هوشمند در دانشگاه تورنتو همکاری خود را آغاز نمودند.زمینه تحقیقاتی ایشان هوش مصنوعی ، بینایی ماشین و تصاویر پزشکی است و همچنین الگوریتم هایی را در زمینه جستجو، قطعه بندی و فیلتر نمودن تصاویر پزشکی بسط داده اند.دکتر تیزهوش بواسطه سازمانهایی همچون  NSERC, OCE, FedDev, MITACS, MaRS, HTX, IRAP, ORF-RE  از پشتیبانی های خوبی برخوردار شدند و 2 کتاب را تالیف نموده اند و بیش از 140 مقاله علمی در ژورنالهای معتبر ارائه داده اند و همچنین با 5 دفتر بازرگانی همکاری دارند و آثار منتشر شده ایشان چندین لوح تقدیر از مراکز مختلف به خود اختصاص داد. علاوه بر این ایشان از تجربیات صنعتی گسترده ای برخوردار هستند و با چندین شرکت از جمله با سازمانManagement of Intelligent Technologies GmbH  در آلمان

و Image Processing Systems Inc. (a Markham-based company acquired by Photon Dynamics Inc. (San Jose, CA)) در کانادا و Medipattern Corporation

(Toronto)در تورنتو همکاری داشته اند و هم اکنون به عنوان مشاور در Huron Digital Pathologyدر کانادا مشغول به کار هستند، بعلاوه اینکه ایشان بیش از ده سال در کار بازرگانی و StartUp تجربه دارند.ایشان در سال 2007 تکنولوژی segasist را درزمینه توسعه نرم افزار قطعه بندی تصاویر رادیولوژی و انکولوژی شروع نمودند و در آمد شرکت تحت سرپرستی ایشان به دو میلیون دلار رسید و همچنین FDA510  را برای تشخیص سرطان پروستات با کمک بیمارستان sunnybrook

و مرکز تشخیص سرطان لندن با موفقیت برنامه ریزی و مدیریت نمودند.

تخصیص حافظه پویا

در زبان سی برای تخصیص حافظه پویا یعنی در زمان اجرا از تابع malloc استفاده می شود پس از خروج از یک تابع لازم است حافظه ای را که با استفاده از تابع malloc تخصیص داده اید را با استفاده از تابع free به سیستم باز گردانید،متغیرهایی که در یک تابع تعریف می شود در هنگام خروج از یک تابع به سیستم بازگردانده می شودولی حافظه ای را که با استفاده از تابع malloc تخصیص می دهیم در انتها آزاد نمی شود،بوسیله تابع free حافظه تخصیص داده شده با malloc را آزاد می نماییم.اگر حافظه آزاد نشود سبب نشتی حافظه (memory leak)می شود.

الگوی تابع:

Void * malloc(size_t size)

در صورت موفقیت اشاره گری به ابتدای بلوکی از حافظه تخصیص می یابد ، نوع خروجی از جنس void* است که میبایستی بر اساس نوع مورد نظر casting صورت پذیرد.در غیر اینصورت خطای compile گزارش داده می شود که در صورت عدم موفقیت صفر و یا null را باز می گرداند.

در زبان سی پلاس پلاس برای تخصیص حافظه پویا (در زمان اجرا) از تابع new استفاده می شود.پس از خروج از یک تابع لازم است حافظه ای را که تخصیص داده اید به سیستم بازگردانید.متغیرهایی که در یک تابع تعریف می شود در هنگام خروج از تابع به سیستم بازگردانده می شود ولی حافظه ای را که با استفاده از تخصیص حافظه پویا در نظر گرفته می شود در انتها آزاد نمی شود.

بوسیله تابع delete حافظه تخصیص داده شده را آزاد می نماییم اگر حافظه آزاد نشود نشتی حافظه و یا memory leak اتفاق خواهد افتاد.

اشاره گر= new < <نوع

delete اشاره گر

int*pn=new int;

delete pn;

اشاره گر= new <نوع>[طول آرایه]

delete [ ] اشاره گر

int*p=new int[20];

delete [ ] p;

 





Stack Memory یک رنج مشخص شده از حافظه است که از طریق رجیستر کردن در cpu قابل دسترسی است ،پشته در زبان اسمبلی بعنوان راهی برای پیاده سازی پرش به کد زیر مجموعه و برگشت استفاده می شد و در جای دیگر برای رسیدگی به وقفه های سخت افزاری

برای مثال در طول یک وقفه استک برای ذخیره سازی چند نوع رجیستر سی پی یو استفاده می شد، شامل status (که هر کدام نتیجه عملگر را نشان می داد)و شمارنده برنامه(هنگام رخداد وقفه)،حافظه استک در طراحی سی پی یو معمولا بسیار بزرگ است و سرعت Alloc و DeAlloc آنها خیلی بالاست چون موکدا از طراحی LIFO استفاده می کنند که یک مثال ساده از ان عملگر های move و inc و dec است

Heap Memory یک حافظه بسیار ساده است که پس از اینکه برنامه بارگذاری و حافظه پشته اختصاص داده شد هنوز باقی مانده و احتمالا هنوز متغیر های عمومی داخل آن باشد

در C++ حافظه پشته جایی است که متغیرهای محلی ذخیره و یا ساخته می شوند و همچنین جایی است که پارامترهای ارسال شده به توابع را نگه می دارد و در کلاس std::stack است که پارامترها را در ان ریخته و تابعی را صدا می زند و تابع می داند که پارامتر مد نظر در انتهای پشته می تواند پیدا شود و همچنین تابع می تواند متغیرهای محلی را در پشته بریزد و قبل از برگشت از تابع انها را خارج نماید.

جهت کاربرد در سایز های بزرگ برای جلوگیری از هدر رفتن حافظه بهتر است که از حافظه پویا استفاده شود

یک تجربه

 به عنوان یک تجربه ای ارزنده  که در مسیر یادگیری کودا بدست آوردم برخود لازم دانستم تا آن را با شما به اشتراک بگذارم در ابتدای نصب و کار با پلتفرم کودا برای این که با مشکلی موجه نشوید حتما سخت افزار کارت گرافیکتان را در سایت NVIDIA بررسی نمایید که آیا پلتفرم CUDA را پشتیبانی می کند یا خیر؟چون کارت گرافیک نصب شده روی سیستم من NVIDIA GEFORCE 210 بود و اطمینان خاطر داشتم که کودا را پشتیبانی می کند ،حتی در حین نصب کودا هم یک خطای سطحی داد و کار نصب را تکمیل نمود (شکل 1)

زعیش1.jpg

شکل1

اما در زمان اجرای کد (از همان کدهای sample کودا )با خطایی که در شکل 2 آمده مواجه شدم که این خطا مربوط به انتقال داده از CPU به GPU بود و نمی توانست کرنل کودا را اجرا نماید.

Code.jpg

add.jpg

بعد از چند روز جستجوی وسیع در سایتهای مختلف متوجه این موضوع شدم که NVIDIA GEFORCE 210 از اولین سری کارتهای گرافیک NVIDIA بوده که کودا را پشتیبانی می کرده است و با نسخه های قدیمی سازگاری دارد ،سپس با بررسی لیست سخت افزار های کارت گرافیک از سایت NVIDIA و تعویض کارت گرافیک با GEFORCE GTX 1050  مشکل حل شد.شما می توانید با مراجعه به آدرس زیر سخت افزار کارت گرافیک خود را بررسی نمایید.

https://developer.nvidia.com/cuda-gpus

و لازم بذکر است بهترین محیط برای برنامه نویسی کودا Visual Studio 2013 با پلتفرم کودا 7.5 و یا 8 است.

و امّا ترتیب نصب ملزومات کودا :

1- نصب درایور کارت گرافیک

2- نصب ویژوال استودیو2013

3- نصب مازول ++C

4- نصب NSIGHT

5- نصب پلتفرم CUDA


Geforce210.jpg

شکل4:GEFORCE 210

 

که شما می توانید با مراجعه به لینک http://cuda-tabatabaei.blogsky.com/category/Programming بصورت دقیقتر مراحل را مشاهده نمایید.