CUDA: مدل برنامه‌نویسی ارائه شده توسط کمپانی nVIDIA

CUDA: مدل برنامه‌نویسی ارائه شده توسط کمپانی nVIDIA

در این مقاله در مورد پلتفرم محاسبات موازی و البته یک مدل برنامه‌نویسی که توسط شرکت nVIDIA ساخته شده و CUDA نام دارد، صحبت خواهیم کرد. در واقع، این پلتفرم اکستنشنی از زبان C است که برای انجام محاسبات با بهره‌گیری از قدرت پردازشی GPU ساخته شده است. برنامه‌نویسی با CUDA به دولوپر این قابلیت را می‌دهد تا از قدرت باورنکردنی پردازش موازی کارت‌های گرافیک شرکت 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 و قدرت GPU بهره می‌برند، حیاتی است.

این را هم در نظر داشته باشید با اینکه اکثر تِرد‌ِهای سیستم شما از یک تابع مشخص یکسان برای اجرا شدن استفاده می‌کنند، اما هر تِرِد برای خود دیتاست مشخصی دارد و هر کدام از تِرِد‌ها ID اختصاصی خود را دارا است و بر روی قسمت خاصی از دیتاست تمرکز کرده است.

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

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

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

لازم به ذکر است که CUDA برای پلتفرم‌های ویندوز، مک و لینوکس به بازار عرضه شده که با مراجعه به صفحهٔ دانلود کودا، می‌توانید با نحوهٔ دانلود و استفاده از آن آشنا شوید.

منبع