این اولین مقاله از مجموعه مروری بر CUDA است که هدف از آن ، بروز کردن مفاهیم کلیدی در CUDA ، ابزارها و بهینه سازی، برای توسعه دهندگان مبتدی یا متوسط است.
اکتشافات علمی و تحلیل های تجاری، به منابع محاسباتی زیادی احتیاج دارند. در بسیاری از کاربرد ها – پیش بینی آب و هوا، شبیه سازی محاسباتی دینامیک سیالات ، و اخیرا یادگیری ماشین و یادگیری عمیق – نیاز به اجرا الگوریتم های پیچیده ای است که برای اجرا، نیاز به توان محاسباتی بیشتری دارند.
صنعت محاسبات برای تأمین کارایی لازم ، به روش های مختلفی تکیه کرده است ، از قبیل افزایش تراکم (تعداد) ترانزیستور، موازی سازی سطح دستورالعمل ( ILP ) ، مقیاس بندی Dennard، و غیره.
- افزایش تراکم ترانزیستورها، نیاز به محاسبات را افزایش داده و باعث شده هر ۱۸ ماه، تراکم تراشه ترانزیستور دوبرابر شود، همانطور که پیش از این توسط قانون Moore پیش بینی شده بود.
- تکنیک هایی مانند موازی سازی سطح دستورالعمل نیز به افزایش عملکرد کمک می کنند اما از حدود سال ۲۰۰۱ ، بازدهی شروع به کاهش کردند.
- همچنین، مقیاس بندی Dennard ، تا سال ۲۰۰۵ با پایان یافتن مقیاس بندی ولتاژ ، مزایایی را در رابطه با قانون مور به همراه داشت.
در حدود سال ۲۰۰۵ ، مقیاس بندی سنتی محاسبات، رو به افول بود و صنعت برای برآورده کردن نیاز های محاسباتی به گزینه های دیگری نیاز داشت. مشخص شد که عملکرد آینده با موازی سازی همراه است.
توان و برقراری ارتباط، از دیگر عوامل مهم بودند. مطالعات نشان داد که توان، بیشتر صرف برقراری ارتباط می شود، ، بنابراین ارتباط بیشتر، به معنای توان بیشتر و محدود کردن مقدار محاسباتی است که می تواند در یک ماشین، بکار برده شود. این بدان معنی است که محاسبات آینده باید از نظر بازدهی توان، کارآمد بوده و همجواری (Locality) را ترجیح دهند.
عصر GPGPU
در دهه ۹۰ و ۲۰۰۰ سخت افزار گرافیکی برای برآورده کردن نیازهای خاص، به خصوص برای حجم کار در صنعت گرافیک طراحی شد. اما حجم کار گرافیکی، نیازمند افزایش توان محاسباتی بود. در نتیجه ، کارایی در حدود ۲٫۴ برابر در سال، نسبت به آنچه دو برابر کردن ترانزیستور می توانست ارائه کند (۱٫۸برابر در سال)، افزایش یافته است. شکل ۱ مسیر عملکرد گرافیکی معروف توسط پروفسور John Poulton از دانشگاه کارولینای شمالی (UNC) را نشان می دهد.
با استفاده از معیار مثلث در هر ثانیه، سخت افزار گرافیکی ، کارایی را در بیش از ۲.۴ برابر در سال، یعنی سریع تر از آنچه قانون مور پیش بینی کرده بود، افزایش داد. این امر به دلیل موازی سازی گسترده موجود در محاسبات گرافیکی رایانه ای بود که سخت افزار توانست از آن استفاده کند. در سال ۲۰۰۱، گرافیک های PC در حال پایان دادن به سیستم های عظیم طراحی شده برای گرافیک بودند.
برای انجمن توسعه دهندگان، این انگیزه ای برای بهره برداری از توان محاسباتی شگفت انگیز، از سخت افزار گرافیکی و سرعت بخشیدن به کارهای علمی مانند تصویربرداری پزشکی، الکترومغناطیسی و موارد دیگر بود.
واحدهای پردازش گرافیکیNVIDIA ( GPU ) در ابتدا برای اجرای بازی ها و حجم های کاری گرافیکی طراحی شدند که پردازش آن ها ذاتا بسیار موازی بود. به دلیل نیاز شدید به FLOPS (عملیات ممیز شناور در ثانیه) و پهنای باند حافظه در صنعت بازی و گرافیک، GPU ها به یک پردازنده بسیار موازی، چند رشته ای ( Multithreaded )، چند هسته ای با توان محاسباتی و پهنای باند حافظه بالا تبدیل شدند. این منجر به شروع عصر GPGPU شد : محاسبات همه منظوره برای GPU ها که در اصل برای سرعت بخشیدن به حجم کاری خاص مانند بازی و گرافیک طراحی شده بود.
مدل محاسبات ترکیبی
GPU ها برای محاسبات بسیار موازی طراحی شده اند و همچنین به عنوان پردازنده های عملیاتی نیز مورد اشاره قرار گرفتند. بسیاری از حجم کاری های علمی و هوش مصنوعی، ذاتاً در الگوریتم های خود موازی سازی گسترده ای دارند و ممکن است روی CPU ها به کندی اجرا شوند.
برنامه های شتابدهنده گرافیکی GPU این کاربرد ها و کارکرد های وقت گیر را (که به آن ها hotspot نیز گفته می شود) به GPU ها می سپارند و از موازی سازی گسترده استفاده می کنند. مابقی برنامه، بر روی CPU اجرا می شود. شما بخش های محاسباتی و وقت گیر کدنویسی خود را به GPU ها می سپارید تا سرعت برنامه خود را بدون انتقال کامل برنامه به GPU ، سرعت ببخشید. به این مدل محاسبات ترکیبی نیز گفته می شود.
در محاسبات ترکیبی ، هر دو پردازنده با هم سازگار بوده اما هنوز هم تفاوت های اساسی دارند. شکل ۲ تفاوت اساسی بین CPU ها و GPU ها را نشان می دهد.
GPU ها بیشتر ترانزیستورهای خود را به پردازش داده اختصاص می دهند در حالی که CPU ها نیز باید فضا را برای حافظه های پنهان بزرگ ، واحد های کنترل و غیره رزرو کنند. پردازنده های CPU بر روی اصل به حداقل رساندن تأخیر در هر رشته کار می کنند در حالی که GPU ها زمان محاسبات و زمان های حافظه را با محاسبه پنهان می کنند. شکل ۳ تفاوت در رشته های محاسبه را نشان می دهد.
همانطور که از شکل ۳ پیداست، معماری CPU باید تاخیر را در هر رشته به حداقل برساند. در CPU ها، هر رشته ، زمان دسترسی داده ( نوار های سفید) را به حداقل می رساند. در طول یک برش زمانی واحد، رشته، تا حد ممکن کار می کند (نوار سبز). برای رسیدن به این هدف CPU ها نیاز به تاخیر کمی دارند که به حافظه های پنهان بالا و منطق کنترلی پیچیده نیاز دارد. حافظه های پنهان (Cache) تنها با چند رشته در هر هسته ، بهتر کار می کنند، چرا که جابجایی رشته ها می تواند هزینه بر باشد.
معماری GPU ، دستورالعمل و تاخیر حافظه را با محاسبات پنهان می کند. در GPU ها ، رشته ها کم حجم هستند، بنابراین یک GPU می تواند بدون هیچ هزینه ای در هر سیکل ساعت، از رشته های متوقف شده به رشته های دیگر جابجا شود.
همانطور که در شکل ۳ نشان داده شده است ، هنگامی که رشته T1 برای داده متوقف شد، رشته دیگر T2 شروع به پردازش می کند و به همین ترتیب T3 و T4. در این میان سرانجام ، T1 داده ها را پردازش می کند. به این ترتیب ، تاخیر، توسط جابجایی به کارهای دیگر موجود ، پنهان می شود. این بدان معناست که GPU ها برای پنهان کردن تأخیر نیاز به رشته های همزمان زیادی دارند. در نتیجه ، شما نیاز دارید هزاران رشته را در GPU اجرا کنید.
برای اطلاعات بیشتر ، به راهنمای برنامه نویسی CUDA مراجعه کنید.