علی آجریان
علی آجریان
خواندن ۳ دقیقه·۵ سال پیش

معماری CUDA

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

واژه ­ی پردازش موازی یک لفظ عام است که به طیف وسیعی از مفاهیم اطلاق می ­شود. این لفظ محدوده ­ای شامل یک پردازش­گر چند هسته ­ای ساده تا یک شبکه ­ی رایانه ­ای بزرگ که محاسباتش را به صورت توزیع شده انجام می ­دهد در بر می­ گیرد؛ فصل مشترک تمامی این حوزه ­ها انجام موازی و پایاپای محاسبات توسط چند عنصر پردازشی است. این عناصر پردازشی می ­توانند یک ابر رایانه ­ی بزرگ، یک رایانه­ ی خانگی، GPU های یک کارت گرافیکی و یا حتی یک تراشه­ ی کوچک الکترونیکی و یا هر عنصر پردازشی دیگری باشند. تنها نکته ­ی مهم این است که عناصر فوق باید بتوانند در یک معماری یکپارچه و مناسب با یکدیگر تعامل داشته باشند.

یکی از معماری­ های جدیدی که در سال 2006 توسط شرکت NVIDIA معرفی شد معماری CUDA است. این معماری به پردازنده­ های کارت گرافیکی این امکان را می­ دهد که علاوه بر پردازش موازی داده­ های گرافیکی سایر پردازش­ها را نیز انجام دهند. از این رو می­ توان گفت که CUDA یک معماری پردازش موازی است که به کارت­های گرافیکی ساخت شرکت NVIDIA این امکان را می­ دهد که به عناصر پردازشی همه منظوره مبدل شوند. البته باید به این نکته توجه داشت که پیش از ظهور CUDA نیز کارت­های گرافیکی وظایف خود را به صورت موازی انجام می­ دادند ولیکن معماری­ آن­ها به گونه ­ای طراحی شده بود که محاسبات مربوطه تنها برای پردازش­ های مربوط به کاربردهای گرافیکی مناسب بود و انجام سایر محاسبات توسط آن­ها با دشواری بسیار زیادی همراه بود. سرانجام با ظهور CUDA کارت­های گرافیکی این امکان را پیدا کردند که به سادگی محاسبات همه منظوره را انجام دهند.

برای استفاده از قدرت محاسباتی بالای کارت­های گرافیکی NVIDIA کافی است الگوریتم مورد نظر خود را به کمک API های موجودی که برای معماری CUDA طراحی شده ­اند، پیاده ­سازی و اجرا کنیم. این API ها در حقیقت واسط­ های برنامه­ نویسی سطح پایینی هستند که ارتباط بین لایه­ های پایین سیستم یعنی سخت ­افزار و نرم­ افزارهای سیستمی را با برنامه ­های کاربردی ممکن می­ سازند. دو مورد از مهم­ترین API هایی که برای استفاده از معماری CUDA طراحی شده ­اند API های OpenCL و DirectCompute هستند.

ماهیت و محل عملکرد API ها این مطلب را به وضوح مشخص می ­کند که استفاده کردن از آن­ها بسیار مشکل و طاقت­ فرسا است. بنابراین برای تسهیل برنامه­ نویسی باید روشی را پیش گرفت که برنامه­ نویس را از مراجعه و درگیری مستقیم با API ها در امان نگه دارد. خوشبختانه این روش وجود دارد و برنامه­ نویس به راحتی می ­تواند برنامه ­ی خود را با یک زبان سطح بالا مثل C توسعه دهد و آسوده خاطر باشد که کامپایلرِ آن زبان، API های مورد نیاز او را به صورت خودکار فرا خواهد خواند.

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

cudaکوداپردازش موازیعلی آجریانبرنامه نویسی
دانشجوی دکتری- دانشگاه بازل
شاید از این پست‌ها خوشتان بیاید