جنگ GPUبین ATIو NVIDIAکه از اوایل سال 2000 شروع شده، منجر به افزایش قدرت پردازشیGPUها شده است. به موازات این افزایش قدرت و سرعت، هر دو شرکت مذکور نیاز به افزایش کیفیت ویدیویی مخصوصا در برنامههای گرافیکی سهبعدی نیز داشتند که این امر در بحث AntiAliasingو AniSotropicبروز کرد. هر دو غول گرافیکی دنیا یعنی ATIو NVIDIAاین ایده را در مرحله عمل اوردهاند و امکان انجام برخی از پردازشهای CPUرا توسط کارتهای گرافیکی خود میسر کردهاند. NVIDIAنام فناوری خود را کودا[1] گذاشته است و ATIهم نام Streamرا انتخاب کرده است.
1- کودا
کودا نام مجموعه فناوریهای سختافزاری و نرمافزاری است که شرکت NVIDIAجهت اجرای محاسبات غیرگرافیکی روی پردازندهگرافیکی عرضه کرده است. از جمله امکاناتی که کودا در اختیار برنامهنویسان قرار داده تا از قابلیتهای سختافزاری کارتهای گرافیکی این شرکت در برنامههای غیرگرافیکی خود بهره برده و سرعت اجرای الگوریتمهای پیچیده خود را به کمک قابلیتهای پردازندهگرافیکی افزایش دهند، تکنیکها و ابزارهای برنامهنویسی موازی بههمراه یک کامپایلر است که دستورالعملهای پردازندهگرافیکی NVIDIAرا تولید میکنند. کلیه کارتهای گرافیکی سری 8000 به بعد شرکت NVIDIAمجهز به این فناوری هستند. برای استفاده از پلتفرم کودا و برنامهنویسی برای استفاده از قدرت GPU، محصولات مختلفی تولید و عرضه شدهاند که عموما در راستای توسعه کد در محیطهای برنامهنویسی پیشرفته بهکار میروند. با این حال، کاربران بسیاری در محیطهای علمی صنعتی وجود داشتند که لازم بود بدون داشتن دانش کافی در برنامهنویسی پیشرفته، بتوانند از قدرت محاسباتی GPUو امکانات کودا استفاده کرده و سرعت محاسبات خود را در زمینههای تحقیقاتی افزایش دهند.
برای رفع این نیاز، شرکت AccelerEyesبا توسعه یک رابط مناسب با نام Jacketبرای نرمافزار Matlabامکان استفاده از فناوری کودا را در یکی از پرکاربردترین نرمافزارهای حوزههای تحقیقات، محاسبات مهندسی و پردازشهای علمی فراهم کرده است. با استفاده از قابلیتهای مناسب مطلب در زمینه پردازش دادههای با حجم بالا بر مبنای زبان برداری مختص خود، کاربران بسیاری در حوزههای ذکر شده، میتوانند با سهولت هرچه تمامتر به توسعه نمونه اولیه الگوریتمها پرداخته و محاسبات مختلف علمی را با سرعت بیشتری انجام دهند. رابط Jacketبا معرفی چند نوع داده جدید در مطلب و توابعی خاص برای کار با انها، تبدیل کدهای نوشته شده برای CPUبه نوع مناسب GPUرا بسیار ساده کرده و کاربر به سادگی میتواند با استفاده از همان مفاهیم قبلی، اسکریپتهای جدیدی بر مبنای GPUبنویسد. یکی از این تمهیدات، استفاده از نام انواع داده و توابع به همراه پیشوند gاست که تغییر در کد را بسیار ساده و اسان کرده است. با اینکه استفاده از نوع دادهای gsingleبرای GPUدر مقابل نوع دادهای Singleبا استفاده از Jacketبسیار ساده است، اما میزان بسیار زیادی از اتفاقات در پس زمینه رخ داده و Jacketوظیفه انجام تبدیل و انتقال دادهها به GPUرا برعهده میگیرد. رابط Jacketبزرگترین مجموعه توابع پیش ساخته را برای استفاده روی GPUدارد. مجموعه غنی این توابع از توابع سادهای چون SUMو SINاغاز شده و توابع پیچیدهای چون INV، SVD، BESSELJو FFTرا شامل میشود. همچنین، برای حفظ ماهیت اسکریپتی و مفسری زبان M، Jacketاز کامپایلر GPUبه صورت بیدرنگ و شفاف[2] استفاده میکند تا دادهها و توابع با انواع مناسب ساختار GPUهمخوانی داشته باشند.
علاوه بر امکانات فوق، ابزارهای گرافیکی یکپارچه منحصر به فردی در این رابط در نظر گرفته شده است تا امکان نمایش و ارائهگرافیکی دادههای GPUبه صورت مستقیم برای کاربر امکان پذیر باشد. به همین دلیل، مشاهده نتایج محاسبات هنگام انجام عملیات پردازش، ساده و سریع بوده و به تبدیل دادهها به انواع بر مبنای CPUو سپس نمایش انها نیازی وجود ندارد. فرمانهای GSURF، GIMAGEو GVOLUMنمونهای از این ابزارها هستند. یکی دیگر از امکانات عالی و بسیار سودمند Jacket، ارائه یک SDKبرای توسعه نرمافزارها بر مبنای این رابط است. مهمترین جزء موجود در این SDK، کامپایلر Jacketاست که امکان کامپایل کد Mتوسعه داده شده در Matlabرا به صورت برنامههای اجرایی مستقل فراهم میسازد. با استفاده از این کامپایلر، همانند کامپایلر موجود در Matlab، کاربر میتواند برنامههای کاربردی مستقلی ایجاد و عرضه کند که از قدرت محاسباتی Matlabو امکانات عالی کودا و GPUبه صورت یکجا استفاده میکند.
اخرین نسخه درایورها، همگی دارای تمامی اجزای مورد نیاز برای کودا هستند. کودا با تمامی GPUها سری 8 به بعد شرکت NVIDIAدر هر سه خط تولید GeForce، Quadroو Teslaکار میکند. NVIDIAتصریح میکند که تمامی برنامههایی که برای GeForceسری 8 نوشته شدهاند، همچنان بدون نیاز به تغییر روی کارتهای جدیدتر اجرا خواهند شد. کودا همچنین امکان دسترسی برنامهنویسان به مجموعه دستورالعملهای اختصاصی[3] و اجزای حافظه در پردازش موازی را نیز فراهم میکند که این امر توانایی برنامهنویس را در کنترل سختافزار بسیار بالا میبرد. بنابراین با استفاده از کودا، معماری GPUها هم مثل CPUها باز میشود، گرچه GPUها برخلاف CPUها دارای یک معماری "بسیار هستهای" موازی هستند که طی ان هستهها توانایی پردازش هزاران نخ را به طور همزمان دارند. بنابراین اگر برنامهای منطبق با این معماری باشد، میتواند راندمانی بسیار بالاتر از اجرا بر روی CPUبه ارمغان بیاورد.
کودا هم برنامه های کاربردی سطح پایین و هم برنامه های کاربردی سطح بالا را فراهم کرده است. در 15 فوریه 2007 کیت SDKمربوط به کودا در محیط ویندوز و لینوکس ارایه شد و سپس در نسخه 2.0 که در تاریخ 14 فوریه 2008 ارایه شد، MacOSهم مورد پشتیبانی قرار گرفت.
ویژگی های کودا
- استفاده از زبان Cاستاندارد برای نوشتن برنامههای پردازش موازی بر روی GPUها
- کتابخانه هایعددی استاندارد برای انجام تبدیل فوریه سریع و زیر روال های اصلی جبر
خطی
- درایور کودا اختصاصی برای انتقال سریع داده ها بین GPUو CPU
- درایور کودا اختصاصی برای عمل متقابل با OpenGLو DirectX
- پشتیبانی از ویندوز لینوکس و Mac OS
مزایای کودا
کودا دارای چندین مزیت نسبت به روشهای معمول پردازش توسطGPUاست که در ادامه ذکر شدهاند:
- خواندن پراکنده: کدها میتوانند از چندین ادرس مختلف از حافظه خوانده شوند.
- دانلود و بازخوانی سریعتر به و از GPU
- حافظه اشتراکی: کودا می تواند بخشی از حافظه را بین نخ ها با سرعت بالا به اشتراک بگذارد که در واقع مثل کشی عمل می کند که توسط کاربر کنترل می شود و پهنای باند بالاتری ایجاد می کند.
- پشتیبانی کامل از عملیات صحیح و بیتی
محدودیتهای کودا
- کودا از یک زبان C، بدون توابع بازگشتی و بدون اشارهگر استفاده میکند و یک پردازش ساده، در بخشهای پراکنده حافظه پخش میشود، بر خلاف حالت عادی که از یک بخش یکپارچه از حافظه استفاده میگردد.
- رندر بافتها [4] را پشتیبانی نمی کند.
- پهنای باند و تاخیر گذرگاه بین CPUو GPUمیتواند گلوگاه سیستم شود.
- در دقت مضاعف هیچ مشکلی وجود ندارد اما در تک دقتی به دلیل مشکلات ساختاری، کمی عدم دقت پیش میاید.
- برای راندمان بالا، نخ ها باید در گروههای حداقل 32تایی اجرا شوند در حالی که نیاز به هزارها نخ است. انشعابها در کد برنامه باعث افت راندمان میشوند و هر 32 تا نخ یک مسیر اجرایی را طلب میکند. مدل اجراییSIMDدر زمان اجرای یک برنامه ذاتا انشعابپذیر، دچار محدودیتهای قابل توجهی میشود.
GPU- ها دارای کودا فقط در تولیدات سری 8 به بعد NVIDIAقابل پشتیبانی هستند.
در بخش 3-5 بطور کامل معماری کودا و برنامه نویسی با ان را توضیح خواهیم داد.
2-Stream
ATIهم با همان ایده NVIDIAاقدام به پردازش موازی توسط GPUها کرده است و ان را ATI Stream Accelerationنامیده است.
Stream مجموعهای از فناوریهای پیشرفته سختافزاری و نرمافزاری است که امکان همکاری پایاپای GPUهای ATIرا با CPUفراهم میکند تا بسیاری از کاربردها و مهمتر از همه، پردازشهایگرافیکی با سرعت بالاتری انجام شوند. در واقع AMDاکوسیستمی طراحی کرده که کارایی بالا، کاربردهای متنوع، نرمافزارهای خاص و ابزارهای ویژه از جمله ویژگیهای ان است.
در واقع Streamبه یک گروه از مسایل، کاربردها یا پردازشها اشاره میکند که میتوانند به عملیاتهای موازی و مجزا شکسته شوند و به طور همزمان روی یک پردازنده اجرا شوند. این جریانهای داده موازی وارد پردازنده میشوند و به صورت موازی در هستههای ان پردازنده اجرا شده و نتایج به صورتی قابل اتصال به هم از پردازنده خارج میشوند.
در واقع مزیت اصلی Streamدر پردازشهای SIMDبروز میکند. چون CPUبراساس روشSISDکار میکند، بنابراین در پردازشهای موازی Streamعالی ظاهر میشود.
برنامههایی که میخواهند برای Streamطراحی شوند، باید دو مشخصه اصلی داشته باشند:
- درجه بالایی از محاسبات ریاضی در هر واکشی از حافظه داشته باشند.
- انجام محاسبات روی هر واحد پردازشی بدون نیاز به بررسی یا تایید هر واحد پردازشی دیگر باشد.
ویژگیهای Streamعبارتند از:
- امکان اجرای برنامههای جدید بر روی معماری جدید
- امکان اجرای پردازشهای موازی که با معماریGPUها جدید مطابقت دارند
- انتقال از توابع ثابت به پایپلاین قابل برنامهنویسی
- کاربردهای وسیع در تحقیقات و صنایع تحت عنوان واحد پردازشی GPGPU
- پشتیبانی از 320 هسته پردازشی (واحد محاسباتی[5])
- پشتیبانی از GPUها سری R600به بعد
مهمترین مزایای Stream
1- مزایای سختافزاری
- انجام محاسبات ممیز شناور با دقت مضاعف
- پشتیبانی از GB2 حافظه اختصاصی GDDR3
- مصرف توان پایین در پردازشهای سنگین (پردازش بیش از 5 میلیارد عملیات ممیز شناور
با یک وات توان)
- نیاز به یک کانکتور برق برای Stream
- DMAغیر همزمان (انتقال دادهها بدون نیاز به وقفه پردازنده)
- امکان استفاده از حافظههایی با اندازه متفاوت برای نگهداری نتایج میانی
- استفاده از یک بورد کوچک (فقط 23.5 سانتیمتر)
- پشتیبانی از اینترفیس PCI Express 2.0 x16
2- مزایای نرمافزاری
- قابل برنامهنویسی با محیطی شبیه Cبا یک کامپایلر سطح بالا
- پشتیبانی از سیستم عاملهای ویندوز و لینوکس 32 و 64 بیتی
اگر قصد خرید کارت گرافیکی دارید، حتما مدلی که کودا یا AVIVOرا پشتیبانی میکند، خریداری کنید. هر چند با خرید این نوع کارتها به تنهایی امکان استفاده از قابلیت فوق را ندارید، اما میتوانید از برنامههایی که برنامهنویسان و تولیدکنندگان براساس این قابلیت نوشتهاند، استفاده کنید و لذت سرعت بالا را حس کنید. مثلا برنامههایی که برای تبدیل فرمتهای مختلف ویدیویی به یکدیگر وجود دارند، با استفاده از CPUاین کار را انجام میدهند، حال انکه برنامههای دیگری براساس کودا یا AVIVOنوشته شدهاند که همان کار را بدون استفاده از CPUچندین برابر سریعتر انجام میدهند. ضمنا دوستداران بازی هم میتوانند بازیهای جدیدتر را که براساس قابلیت فوق عرضه میشوند، بسیار طبیعیتر و روانتر بازی کنند.
بطور خلاصه می توان گفت که استفاده از GPUبه جای CPUدو مزیت اصلی دارد:
- سرعت بسیار بالاتر در انجام محاسبات
- ازاد شدن CPUو استفاده از ان در کارهای دیگر