CUDA مدل برنامهنویسی ارائه شده توسط کمپانی nVIDIA
CUDA مخفف Compute Unified Device Architecture هست و دارای معماری است بر پایه پردازش موازی. این فناوری توسط شرکت انویدیا ابداع شد. در واقع کودا یک موتور قدرتمند محاسباتی(پردازش) GPU های کارت گرافیک های nvidia می باشد .پردازندههایی مثل Intel Core two Duo یا مثلاً AMD Opteron در انجام یک یا دو کار همزمان با سرعت بالا، بسیار عالی عمل میکنند اما کارتهای گرافیک دقیقاً برعکس این عمل میکنند؛ به عبارت دیگر، آنها در انجام چندین کار همزمان بهصورت تقریباً سریع خوب عمل میکنند. برای اینکه این واقعیت را بهتر درک کنید، تصور کنید که یک مانیتور معمولی با رزولوشن ۱۹۲۰ در ۱۲۰۰ دارید؛ یک کارت گرافیک nVIDIA باید قادر باشد تا ۲۳۰۴۰۰۰ پیکسل مختلف را در چندین بار در دقیقه پردازش کند.برای انجام این کار، کارتهای گرافیک از چندین ALU که مخفف همان Arithmetic Logic Unit است استفاده میکنند. خوشبختانه ALUهای کمپانی nVIDIA کاملاً قابل برنامهریزی هستند که قابلیت شخصیسازی کامل برای انجام محاسبات دلخواه را به ما میدهد.
همانطور که گفته شد، CUDA به دولوپر اجازه میدهد تا تعداد زیادی از ALUهای داخل پردازندهٔ کارت گرافیک را به خدمت خود درآورد و این در مقایسه با چندALU یی که بهصورت مجازی در CPU ایجاد شده است، بسیار به صرفهتر است.
CUDA کاملاً برای الگوریتمهای موازی طراحی شده است:
برای اینکه از GPU به نحوه احسن بهره ببرید، باید از تعداد زیادی تِرِد استفاده کنید. به طور کلی، هرچه تِرِد بیشتری داشته باشید، بهتر است. بسیاری از الگوریتمهای سریال (پیاپی)، معادلهای موازی نیز دارند اما بعضی از آنها فاقد این معادل هستند. در صورتی که شما نتوانید مساله خود را به حداقل ۱۰۰۰ تِرِد بشکنید، احتمالاً CUDA گزینه ایدهآلی برایتان محسوب نمیشود.
CUDA برای محاسبات عددی عالی است:
برای انجام محاسبات عددی بهتر است که از CUDA استفاده کنید زیرا این کار را به خوبی انجام خواهد داد. محاسبهٔ اعدادی از نوع Float یا Integerهای ۳۲بیتی هیچ مشکلی در محاسبات نخواهند داشت. فقط در طراحی الگوریتم خود با CUDA بر روی کارتهای گرافیک عادی، تا جایی که امکان دارد و نیاز نیست، از Double Float استفاده نکنید.
CUDA برای دیتاستها عالی است:
اکثر CPUها فقط چند مگابایت کش لایهٔ دو دارند، در حالی که ممکن است الگوریتم ما نیاز به مقدار بیشتری داشته باشد و با دیتاستی کار کنیم که مثلاً ۵۰۰ مگابایت فضا نیاز دارد؛ اینجا دیگر کش لایهٔ دو به کار ما نخواهد آمد.
اینترفیس حافظه با پردازنده در GPU خیلی متفاوتتر از CPU است. GPU از تعداد زیادی ارتباط موازی برای ارتباط با حافظه استفاده میکند؛ مثلاً کارت GTX280 از یک اینترفیس ۵۱۲ بیتی برای ارتباط با حافظه GDDR3 خود استفاده میکند. این نوع از اینترفیسها مسلماً دهها برابر سریعتر از CPUها با حافظه ارتباط برقرار کرده و دادهها را سریعتر انتقال میدهند که قابلیت بسیار جذابی است.
همچنین باید به این نکته نیز اشاره کنیم که اکثر کارتهای گرافیک موجود در بازار حدوداً ۱ گیگابایت حافظه دارند و nVIDIA با استفاده از CUDA میتواند تا ۴ گیگابایت را نیز از حافظهٔ رم موجود در سیستم برای کارهای خود استفاده کند (البته کارتهایی که این ویژگی را دارند کمی گرانتر از کارتهای عادی هستند)
نوشتن کِرنِل در :CUDA
همانطور که قبلاً اشاره کردیم، CUDA میتواند از تمامی قابلیتهای زبان برنامهنویسی C بهره ببرد .این خبر خوبی است زیرا اکثر دولوپرها با زبان C آشنایی دارند. باز هم همانطور که اشاره کردیم، کانسِپت اولیهٔ CUDA بر روی صدها تِرِد که بهصورت موازی پردازش میشوند، استوار است.
نوشتن برنامه با :CUDA
یکی از مسائلی که باید به یاد داشته باشید این است که لازم نیست تمامی قسمتهای برنامهٔ شما با CUDA نوشته شده باشد. برای مثال، اگر یک برنامهٔ تجاری برای پلتفرمهای مختلف مینویسید که ممکن است در آینده توسعه یابد، احتمالاً یک اینترفیس با زبانهای مختلف خواهید نوشت و ویژگیهای مختلفی را نیز به برنامه خود اضافه خواهید کرد و البته شاید بسیاری از این کدها را با C++ بنویسید و یا هر زبانی که آن را ترجیح میدهید.
سپس، زمانی که نیاز به نوعی از محاسبات خاص دارید، برنامهٔ شما میتواند به راحتی کِرنِل CUDA را صدا بزند تا به کمک شما بیاید. پس ایدهٔ اصلی این است که به سادگی CUDA را برای انجام محاسبات و یا هر حوزهٔ مشخصی که نیاز دارید، فراخوانی کنید.
در پایان هم یادآوری این نکته ارزشمند است که CUDA برای کار با کارتهای گرافیک nVIDIA طراحی شده است اما با این حال میتواند بهصورت مجازی بر روی هر CPUیی نیز کار کند. البته در نظر داشته باشید که آنقدر مجهز نخواهد بود که مثل آنچه که توضیح دادیم، بر روی CPU نیز سریع باشد.