معرفی CUDA

CUDA یک پلت‌فرم محاسباتی موازی و مدل برنامه‌نویسی است، که با استفاده از GPU به صورت عمومی برای محاسبات ساده ساخته شده است، توسعه‌ای از زبان برنامه‌نویسی C می‌باشد و توسط nVidia توسعه یافته است. برنامه‌نویسی CUDA به برنامه‌نویس اجازه می‌دهد تا از قدرت عظیم محاسبات موازی کارت گرافیک nVidia برای توانمند شدن در محاسبات اساسی استفاده کند.

معرفی CUDA

پردازنده‌های Intel Core two Duo و همچنین AMD Opteron در انجام یک یا شاید دو کار در یک زمان، خیلی خوب عمل می‌کنند و این وظایف را به سرعت انجام می‌دهند. اما کارت‌های گرافیکی تعداد بسیار زیادی از این وظایف را در یک زمان انجام می‌دهند و این کارها نسبتا سریع انجام می‌شود. برای ارائه این دیدگاه، تصور کنید یک مانیتور 20 اینچ با رزولوشن 1200*1920 دارید. کارت گرافیک nVidia توان محاسباتی برای محاسبه رنگ 2,304,000 پیکسل مختلف، چند بار در دقیقه، را دارد.

برای رسیدن به این شاهکار، کارت گرافیک‌ها از انتخاب عظیمی از ALUها استفاده می‌کنند. خوشبختانه، Nvidia ALUها کاملا قابل برنامه‌ریزی هستند، که به ما اجازه می‌دهند سطح بی‌نظیری از قدرت محاسباتی در برنامه‌هایی که ایجاد می‌کنیم را تحت کنترل درآوریم.

همان‌طور که قبلا ذکر شد، CUDA به برنامه‌نویسان اجازه می‌دهد تا انتخاب‌های زیادی از ALU را داخل یک پردازنده گرافیکی به دست آورند و این در مقایسه با دو جفت ALU قابل دسترس در اکثر CPUها بسیار مؤثرتر است.

CUDA فقط برای بسیاری از الگوریتم‌های موازی مناسب است

برای اجرای مؤثر در GPU، شما باید چندین انتخاب از thread داشته باشید. به طور کلی، داشتن thread بیشتر، بهتر است. در این صورت شما الگوریتمی دارید که عمدتا ترتیبی است.

به دنبال آن، CUDA منطقی به نظر نمی‌رسد. بسیاری از الگوریتم‌های ترتیبی معادل موازی دارند، اما بعضی از آن‌ها ندارند. در این صورت شما نمی‌توانید مشکل خود را به کمتر از هزار thread برسانید، بنابراین احتمالا CUDA راه‌حل خوبی برای شما نیست.

CUDA برای number crunching خیلی خوب طراحی شده است

یکی از مواردی که CUDA در آن برتری دارد، number crunching (انجام سریع محاسبات بزرگ) است. GPU کاملا در عملکردهای عدد صحیح 32 بیتی و همچنین عملیات ممیز شناور مؤثر است. GPUها برای عملیات ممیز شناور بهتر طراحی شده‌اند،‌ و CUDA برای number crunching بسیار عالی است. برخی از کارت گرافیک خیلی بزرگ، دو دستگاه ممیز شناور دارند. با این حال، تنها یک حاصل ممیز شناور 64 بیتی برای هر شانزده واحد ممیز شناور 32 بیتی وجود دارد. بنابراین با استفاده از اعداد ممیز شناور دوبل با CUDA باید از مواردی که برای برنامه‌یتان ضروری نیستند، دور بمانند.

CUDA برای پایگاه داده‌های بزرگ خوب طراحی شده است

اکثر پردازنده‌های جدید چند مگابایت حافظه پنهان (کش) L2 دارند، زیرا بسیاری از برنامه‌ها ارتباط داده‌ای بسیار بالایی با هم دارند. با این وجود، وقتی عملیات بلافاصله در میان داده‌های بزرگ انجام می‌شود، 500 مگابایت کش L2 ممکن است سودمند نباشد.

رابط حافظه GPUها بسیار متفاوت از رابط حافظه CPUها است. GPUها از رابط‌های موازی بزرگ استفاده می‌کنند تا بتوانند با آن ارتباط برقرار کنند. مثلا، GTX 280 از رابط 512 بیتی استفاده می‌کند تا به حافظه GDDR 3 سطح بالا و پیشرفته تبدیل شود. این نوع خاص از رابط حدود 10 برابر سریع‌تر از CPU معمولی برای رابط حافظه است که واقعا فوق‌العاده است.

شایان ذکر است که اکثر کارت‌های گرافیک‌ nVidia حتی بیش از یک گیگابایت حافظه هم ندارند. Nvidia دارای کارت‌های محاسباتی CUDA خاص است که به اندازه 4 گیگابایت رم onboard هستند. اما این کارت‌ها نسبت به کارت‌هایی که برای بازی استفاده می‌شوند گران‌تر می‌باشند.

نوشتن هسته در CUDA

همان‌طور که قبلا گفته شد، CUDA برای نوشتن در C کاملا سودمند می‌باشد. این خبر خوبی است زیرا اکثر برنامه‌نویسان در C دانش و اطلاعاتی دارند. مفهوم اولیه CUDA شامل تعداد زیادی thread به صورت موازی است.

چیزی که مشخص نشد این واقعیت است که بسیاری از این threadها احتمالا برای اجرای عملکرد مشخصی، که به عنوان هسته شناخته شده است، می‌باشند. وقتی یک برنامه را با استفاده از CUDA محاسبه می‌کنید، درک کاملی از هسته و نحوه این عملکردها برای موفقیت شماست که بسیار حیاتی هستند.

هر چند که هر یک از threadهای سیستم شما عملکردی را اجرا می‌کنند، threadها با یک مجموعه داده متناوب سر و کار خواهند داشت. هر thread دارای یک ID است و تصمیم می‌گیرد بر کدام بخش اطلاعات تمرکز کند. دستوراتی مثل if، do، while، for و غیره پشتیبانی می‌شوند.

نوشتن برنامه با CUDA

یکی از مهم‌ترین مواردی که باید در نظر داشت این واقعیت است که لازم نیست کل برنامه شما در CUDA ساخته ‌شود. درصورتی که یک برنامه قابل ملاحظه‌ای، با یک رابط کامل، و همچنین ویژگی‌های افزوده شده فراوان را ساخته باشید، متعاقبا بسیاری از کدهای شما در C++ یا هر زبان برگزیده دیگری نوشته می‌شوند.

سپس، وقتی چیزی که شدیدا محاسباتی است مورد نیاز باشد، برنامه فقط می‌تواند تابع هسته CUDA که نوشته‌اید را فراخوانی کند. بنابراین ایده اولیه، این واقعیت است که CUDA باید به سادگی برای قسمت‌هایی از برنامه‌یتان که شدیدا محاسباتی هستند مورد استفاده قرار گیرد.

CUDA بدون داشتن کارت گرافیک

در حالی که CUDA منحصرا برای عملیات روی کارت گرافیک nVidia طراحی شده است، می‌تواند روی اکثر CPUها کار کند. اگرچه سیستم هرگز مجهز به اجرا با همان سرعت سریع بر روی CPU نخواهد بود، اما اجرا خواهد شد.

منبع تاپ لرن

دانلود نسخه ی PDF این مطلب