مروری بر CUDA – قسمت دوم : شروع کار با CUDA

این دومین مقاله از مجموعه مروری بر CUDA است که هدف از آن ، بروز کردن مفاهیم کلیدی در CUDA ، ابزارها و بهینه سازی، برای توسعه دهندگان مبتدی یا متوسط است.

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

اولین چالش، ساده سازی برنامه نویسی موازی برای ساده تر کردن برنامه است. برنامه نویسی آسان، توسعه دهندگان بیشتری را به خود جذب می کند و به آن ها انگیزه می دهد تا برنامه های بیشتری را به پردازنده های موازی منتقل کنند. چالش دوم توسعه نرم افزارهای کاربردی است که موازی سازی خود را، با افزایش تعداد هسته پردازنده با GPU ها، مقیاس گذاری می کنند.

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

معرفی CUDA

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

NVIDIA ، اولین نسخه CUDA را در نوامبر ۲۰۰۶ منتشر کرد که با یک محیط نرم افزاری همراه بود و به شما امکان می داد از زبان C به عنوان یک زبان برنامه نویسی سطح بالا استفاده کنید. هزاران برنامه کاربردی توسط CUDA تسریع شده اند، از جمله کتابخانه ها و چارچوب ها که زمینه ساز تحول مداوم در یادگیری ماشین و یادگیری عمیق است.

برنامه نویسی آسان

برای چارچوب گذاری آسان ، CUDA یک رابط کاربری ساده مبتنی بر زبانC++ / C ارایه می دهد. مزیت بزرگ الگوی برنامه نویسی CUDA این است که به شما امکان می دهد یک برنامه اسکالر بنویسید. کامپایلر  CUDA، از انتزاعات برنامه نویسی برای بهره برداری از موازی سازی موجود در الگوی برنامه نویسی CUDA استفاده می کند. این امر، بار برنامه نویسی را کاهش می دهد. در اینجا برخی مبانی، در مورد مدل برنامه نویسی CUDA آورده شده است.

مدل برنامه نویسی CUDA سه افزونه کلیدی زبان برنامه نویسی را به برنامه نویسان ارائه می کند:

  • بلوک هایCUDA : مجموعه یا گروهی از رشته ها ( Threads ).
  • حافظه اشتراکی: حافظه مشترک در یک بلوک بین همه رشته ها.
  • موانع همگام سازی: فعالسازی رشته های متعدد برای صبر کردن تا زمانی که همه رشته ها قبل از ادامه هر رشته، به نقطه خاصی از اجرا برسند.

کد نمونه ی زیر، هسته CUDA را نشان می دهد که دو بردار A وB را با هم جمع می کند. خروجی بردار دیگر به نام C است. کد هسته در GPU اجرا می شود و ذاتا مقیاس پذیر است زیرا دو بردار را به نحوی اضافه می کند که شبیه به اضافه کردن دو عدد اسکالر است.

/** CUDA kernel device code - CUDA Sample Codes
 * Computes the vector addition of A and B into C. The three vectors have the same number of elements as numElements. 
 */
__global__ void vectorAdd( float *A, float *B, float *C, int numElements) {
  int i = blockDim.x * blockIdx.x + threadIdx.x;
  if (i < numElements) {
    C[i] = A[i] + B[i];
  }
}

این کد، روی GPU ، به روشی کاملاً موازی اجرا می شود. این امر به این دلیل است که هر عنصر از بردار توسط یک رشته در بلوک CUDA اجرا می شود و همه رشته ها بصورت موازی و مستقل اجرا می شوند و موجب ساده شدن برنامه نویسی موازی می شود.

مقیاس پذیری آسان

الگوی برنامه نویسی CUDA ، مقیاس پذیری نرم افزار را با افزایش تعداد هسته های پردازنده در GPU ها امکان پذیر می سازد. شما می توانید برنامه ها را با استفاده از انتزاعات زبان CUDA برنامه نویسی کنید. هر مسئله یا برنامه می تواند به مسائل مستقل کوچک تقسیم شود و به طور مستقل در بین این بلوک های CUDA حل شود. هر بلوک CUDA ، یک مسئله فرعی را در قسمت های ظریف تر با اجرا رشته های موازی و همکاری با یکدیگر حل می کند. زمان اجرای CUDA ، تعیین می کند این بلوک های CUDA را در یک GPU در هر دستور، بر روی چندپردازنده زمان بندی کند. این کار به برنامه CUDA اجازه می دهد تا روی هر تعداد از چندپردازنده ها مقیاس بندی و اجرا شوند.

شکل ۱ این مفهوم را نشان می دهد. برنامه CUDA کامپایل شده دارای هشت بلوک CUDA است. زمان زمان اجرا CUDA می تواند نحوه اختصاص این بلوک ها به چند پردازنده را مطابق با چندپردازنده جریانی (SM) نشان دهد.

برای یک GPU کوچک تر با چهار  SM، هر SM دو بلوک CUDA دریافت می کند. برای یک GPU بزرگ تر با هشت SM، هر SM یک بلوک CUDA دریافت می کند. این امر قابلیت مقیاس پذیری عملکرد را برای برنامه های دارای GPU قدرتمندتر بدون هر گونه تغییر کدی، میسر می سازد.

بلوک های برنامه نویسی CUDA
مقیاس پذیری بلوک های CUDA در میان انواع مختلف GPU ها

نصب CUDA

در این قسمت به نحوه آماده سازی سیستم برای نصب CUDA پرداخته شده است. پس از نصب CUDA ، می توانید شروع به نوشتن برنامه های موازی کرده و از موازی سازی گسترده موجود در GPU ها استفاده کنید.

در اینجا الزامات اجرای CUDA بر روی سیستم شما، آورده شده است:

شما برای اجرای برنامه های CUDA به یک GPU سازگار با CUDA نیاز دارید. GPU های سازگار با CUDA به هر شکلی که ممکن است از توان محاسباتی استفاده کنید، وجود دارند : نوت بوک ها ، ایستگاه های کاری ، مراکز داده یا ابری . بیشتر لپ تاپ ها نیز دارای GPU های NVIDIA هستند. GPU های NVIDIA کلاس Tesla وQuadro – که به طور گسترده در مراکز داده و ایستگاه های کاری استفاده می شوند – نیز با CUDA سازگار هستند. تمام ارائه دهندگان مطرح سرویس های ابری ، مواردی مبتنی بر GPU دارند که می توانید در آن، برنامه های CUDA را اجرا کنید.

  • نسخه ای از سیستم عامل که از کامپایلر GCC و زنجیره ابزار پشتیبانی می کند.

برای فهرستی از سیستم عامل هایی که از کامپایلرها و ابزارهایGCC  پشتیبانی می کنند، به راهنمای نصب CUDA مراجعه کنید.

  • جعبه ابزار NVIDIA CUDA

NVIDIA جعبه ابزار CUDA را بدون هیچ هزینه ای ارائه می دهد. این جعبه ابزار شامل کتابخانه های شتابدهنده GPU ، کامپایلر ، ابزارهای توسعه و  Runtime های CUDA است.

برای اطلاعات بیشتر ، به راهنمای برنامه نویسی CUDA مراجعه کنید.

بیشتر بخوانید :

منبع NVIDIA

درباره‌ی امیر اقتدائی

همچنین ببینید

آیا می خواهید در زمینه یادگیری ماشین استخدام شوید؟

آیا می خواهید در زمینه یادگیری ماشین استخدام شوید؟

مسیر های شغلی زیادی در حوزه یادگیری ماشین وجود دارد، اما از کجا بفهمیم که …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *