CUDA: مدل محاسبات موازی ارائه شده توسط کمپانی اِنویدیا

CUDA: مدل محاسبات موازی ارائه شده توسط کمپانی اِنویدیا

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

اولین کسی باشید که به این سؤال پاسخ می‌دهید

پردازنده‌هایی مثل Intel Core two Duo یا مثلاً AMD Opteron در انجام یک یا دو کار هم‌زمان با سرعت بالا از عملکرد خوبی برخوردارند اما قضیه در مورد کارت‌های گرافیک تا حدودی متفاوت است. برای اینکه این واقعیت را بهتر درک کنید، تصور کنید که یک مانیتور معمولی با رزولوشن ۱۹۲۰ در ۱۲۰۰ دارید که یک کارت گرافیک اِنویدیا باید قادر باشد تا ۲۳۰۴۰۰۰ پیکسل مختلف را در چندین بار در دقیقه پردازش کند. برای انجام این کار، کارت‌های گرافیک از چندین Arithmetic Logic Unit یا به اختصار ALU استفاده می‌کنند. 

جالب است بدانید که کمپانی اِنویدیا دست به ساخت یکسری ALU می‌زند که کاملاً قابلیت برنامه‌ریزی دارند که در نهایت امکان شخصی‌سازی کامل برای انجام محاسبات دلخواه‌ را به دولوپرها می‌دهند. در یک کلام، CUDA به دولوپرها اجازه می‌دهد تا ALU داخل پردازندهٔ کارت گرافیک را به خدمت خود درآورند و در مقایسه با CPU با چند ALU که به‌ صورت مجازی در آن ایجاد شده بسیار به صرفه‌تر است.

برای اینکه از GPU به بهترین شکل ممکن بهره ببرید، باید از تعداد زیادی تِرِد استفاده کنید. به طور کلی، هرچه تِرِد بیشتری داشته باشید بهتر است و بسیاری از الگوریتم‌های سریالی معادل‌های موازی نیز دارند اما بعضی از آن‌ها فاقد این فیچر هستند و در صورتی که نتوانید مسألهٔ خود را به حداقل ۱۰۰۰ تِرِد بشکنید، احتمالاً CUDA گزینه ایده‌آلی برایتان محسوب نمی‌شود.

اکثر سی‌پی‌یو‌ها فقط چند مگابایت کش لایهٔ دو دارند در حالی که ممکن است الگوریتم‌ ما نیاز به مقدار بیشتری فضای حافظه داشته باشد و با دیتاسِتی کار کنیم که مثلاً ۵۰۰ مگابایت فضا نیاز دارد و اینجا است که دیگر کش لایهٔ دو به کار ما نخواهد آمد. همچنین به خاطر داشته باشیم که اینترفیس میان حافظه با پردازنده در GPU خیلی متفاوت‌تر از CPU است به طوری که کارت گرافیک از تعداد زیادی ارتباط موازی برای ارتباط با حافظه استفاده می‌کند (مثلاً کارت GTX280 از یک اینترفیس ۵۱۲ بیتی برای ارتباط با حافظه GDDR3 خود استفاده می‌کند.) این نوع از اینترفیس‌‌ها مسلماً ده‌ها برابر سریع‌تر از سی‌پی‌یوها با حافظه ارتباط برقرار کرده و داده‌ها را سریع‌تر انتقال می‌‌دهند که قابلیت بسیار جذابی است.

همچنین باید به این نکته نیز اشاره کنیم که اکثر کارت‌‌های گرافیک موجود در بازار حدوداً ۱ گیگابایت حافظه دارند و اِنویدیا با استفاده از CUDA می‌تواند تا ۴ گیگابایت را نیز از حافظهٔ رم موجود در سیستم برای کارهای خود استفاده کند (البته کارت‌هایی که این ویژگی‌ را دارند کمی گران‌تر از کارت‌های عادی هستند.)

همان‌طور که قبلاً اشاره کردیم، CUDA اِکستنشنی برای زبان برنامه‌نویسی C است و بالتبع می‌تواند از قابلیت‌های منحصربه‌فرد این زبان استفاده کند اما چیزی که تا اینجا بدان اشاره نکرده‌ایم این است که بسیاری از تِرد‌ِها از واحدی یکسان برای اجرا شدن استفاده می‌کنند که به آن کِرنِل می‌گویند. دانستن اینکه کِرنِل چیست و چگونه کار می‌کند، برای نوشتن برنامه‌هایی که از CUDA و قدرت GPU بهره می‌برند، حیاتی است. این را هم در نظر داشته باشید با اینکه اکثر تِرد‌ِهای سیستم شما از یک تابع مشخص برای اجرا شدن استفاده می‌کنند، اما هر تِرِد برای خود دیتاسِت مشخصی دارد و هر کدام از تِرِد‌ها ID اختصاصی خود را دارا است و بر روی قسمت خاصی از دیتاست تمرکز کرده است.

نوشتن برنامه با CUDA
یکی از مسائلی که باید به یاد داشته باشید این است که لازم نیست تمامی قسمت‌های برنامهٔ شما با CUDA نوشته شده باشد. برای مثال، اگر یک برنامهٔ تجاری برای پلتفرم‌‌های مختلف می‌نویسید که ممکن است در آینده توسعه یابد، احتمالاً یک اینترفیس با زبان‌‌های مختلف خواهید نوشت و ویژگی‌های مختلفی را نیز به برنامه خود اضافه خواهید کرد و البته شاید بسیاری از این کد‌‌ها را با ++C بنویسید و یا هر زبانی که آن را ترجیح می‌دهید. سپس، زمانی که نیاز به نوعی از محاسبات خاص دارید، برنامه‌ٔ شما می‌تواند به راحتی کِرنِل CUDA را صدا بزند تا به کمک شما بیاید. در حقیقت، ایدهٔ اصلی این است که به سادگی CUDA را برای انجام محاسبات و یا هر حوزه‌ٔ مشخصی که نیاز دارید، فراخوانی کنید.

در پایان هم یادآوری این نکته لازم است که CUDA برای کار با کارت‌های گرافیکی اِنویدیا طراحی شده است اما با این حال می‌تواند به‌ صورت مجازی بر روی هر سی‌پی‌یویی نیز کار کند (البته در نظر داشته باشید که آن‌قدر مجهز نخواهد بود که مثل آنچه که توضیح دادیم، بر روی CPU نیز سریع باشد.) در پایان هم نیاز به توضیح است که CUDA برای پلتفرم‌های ویندوز، مک و لینوکس به بازار عرضه شده که با مراجعه به صفحهٔ دانلود کودا، می‌توانید با نحوهٔ دانلود و استفاده از آن آشنا شوید.