معرفی معماری Graphics Core Next تراشه های گرافیکی ( GPU ) کمپانی AMD
شنبه 9 آذر 1392 6:44 PM
در این مقاله به صورت اجمالی به معرفی معماری GCN تراشه های گرافیکی کمپانی AMD خواهیم پرداخت. کارت های گرافیک سری RADEON 7000 و RADEON R9/R7 جزو مدل هایی هستند که GPU های بر پایه این معماری را به همراه دارند.
معرفی معماری VLIW
قبل از اینکه وارد جزئیات معماری GCN شویم شاید بهتر است کمی با برخی از اصطلاحات و پیش نیازهای این بحث آشنایی بیشتری پیدا کنیم.
واحد اصلی پردازنده های جریانی (Streaming Processors) که در معماری نسل قبلی GPU های کمپانی AMD استفاده می شد SPU نام داشت. در همه طراحی های مدرن GPU توسط AMD به غیر از CAYMAN ( GPU به کار رفته در سری 6900 ) از معماری VLIW5 (Very Long Instruction Word 5 ) استفاده می شد که در معماری ساخت CAYMAN از تکنیک VLIW4 استفاده شده است. همانطور که در اسامی دو معماری فوق مشخص است هر معماری دارای 5 یا 4 واحد محاسباتی بنیادی ریاضی می باشد. کمپانی AMD این واحد ها را Radeon Cores می نامد. این واحد های بنیادی، به صورت موازی دستورالعمل های منحصر به فرد خود را در سیکل های کلاک مشخص اجرا و پردازش می کنند.
هر Radeon Core دارای قسمت های مختلف نظیر ثبات ها (registers ) ، یک واحد شاخه ای (branch unit ) و یک واحد مخصوص اجرای توابع غیر جبری می باشد.
واحدهای VLIW به گونه ای طراحی شده اند که به صورت موازی و با تقسیم کردن Task های جاری به قسمت های کوچکتر به نام wavefronts ، عملیات منطقی را با سرعت بسیار بالایی انجام دهند. در معماری AMD یک wavefronts شامل می شود از 64 پیکسل/مقادیر و دستورالعمل هایی که برای نمایش این مقادیر و پیکسل ها لازم است.
به صورت ایده آل در یک wavefront ممکن است یک گروه 4 یا 5 تایی دستورالعمل ها به صورت کاملا مستقل باشند و باعث تغذیه و فعال شدن همه Radeon Core ها شوند. در اکثر موارد دستورالعمل های مستقل در هر سیکل کلاک در گروهایی کمتر از 4 یا 5 تایی، Radeon Core ها را تغذیه می کنند و در بدنرین حالت به وضعیتی می رسیم که تنها یک دستورالعمل توسط VLIW پردازش می شود. همانطور که ملاحضه می کنید بازدهی VLIWها بسیار کمتر از حد انتظار است.
استفاده از معماری VLIW در کارت های گرافیک ATI برمی گردد به اولین GPU با قابلیت پشتیبانی از DX 9.0 ساخت این کمپانی یعنی R300 ( به کار رفته در مدل های سری 9700 ) که دارای 4 واحد ضرب نقطه ای ( w, x, y, z) و یک واحد اسکالر ( برای مثال lighting ) بود. با به عرصه رسیدن unified shaders در DX 10.0 و همزمان با طراحی R600 ( به کار رفته در مدل های سری 2900 ) به دلیل اینکه کدنویسی APP ها و Game های جدید مرتبط با API جدید به گونه ای بود که به به ندرت از هر 5 VLIW در آن واحد استفاده می شد کمپانی ATI تصمیم گرفت تا از معماری VLIW4 در معماری جدید استفاده کند تا بازدهی کارایی را در محصولات جدید خود افزایش دهد.
به طور کلی معماری VLIW از دیرباز داستانی پر فراز و نشیب داشته و همیشه با مشکل بازدهی پایین روبرو بوده است.
SIMD
آنچه پس از سال ها تجربه به کارشناسان سخت افزار و نرم افزار در این حیطه ثابت شده این موضوع می باشد که معماری VLIW در کاربردهای گرافیکی عملکرد مناسبی دارد ولی در کاربردهای محاسباتی نظیر GPGPU به هیچ وجه بازدهی خوبی ازخود نشان نمی دهد. اما یکی از اهداف کمپانی AMD در طراحی معماری جدید تقویت قابلیت GPU Computing در GPU های ساخت خود بود.از طرفی ابتکار جدید این کمپانی ( FUSION ) فقط قرار دادن یک GPU ضعیف در کنار یک CPU بر روی یک Die نیست. بلکه این کمپانی به دنبال ساخت و طراحی نوعی معماری کاملا متفاوت از GPU می باشد که همانند CPU محاسبات منطقی را با سرعت زیاد انجام دهد.
در معماری GCN طراحی VLIW کم کم جای خود را به معماری non-VLIW SIMD می دهد. در اصل این دو طراحی شباهت های زیادی با یکدیگر دارند. هر دو دستورالعمل های زیادی را به صورت موازی اجرا می کنند، اما تفاوت های زیادی از نظر نحوه اجرا کردن دستورالعمل ها با هم دارند. VLIW در موازی سازی بر اساس extracting instruction level parallelism (IPL)l یا همانطور که اشاره شد استخراج دستورالعمل ها در سطحی خاص عمل می کند ولی طراحی non-VLIW SIMD در درجه اول بر اساس تکنبک thread level parallelism (TLP)l داده ها را پردازش می کند.
پرداختن به مفاهیم عمیق و تخصصی تفاوت ساختاری این دو نوع طراحی به قدری پیچیده و مفصل است که این مقاله را به اندازه کافی طولانی و خسته کننده خواهد کرد. به طور کلی بحث را به اینکه چرا طراحی VLIW در کاربردهای GPU Computing ضعیف عمل کرده و چگونه طراحی non-VLIW SIMD این مشکل را رفع می کند محدود خواهیم کرد.
مسئله اصلی این است که در طراحی VLIW برنامه ریزی جلوتر از زمان ( حدس زدن دستورات بعدی ) به سختی صورت می گیرد و برنامه ریزی پویا نیز در حین اجرا دستورات صورت نمی گیرد و در گرو این دو ضعف بزرگ روی هم رفته کارایی GPU Computing در عمل به شدت کاهش خواهد یافت.
علاوه بر این بازدهی کارایی در طراحی VLIW به شدت وابسته به نوع کامپایلر می باشد. همین امر باعث می شود که زبان های برنامه نویسی مختلف شرایط سازگاری با این نوع طراحی ها را به طور کامل نداشته باشند. به همین دلیل هیچ گاه بازدهی مناسبی نخواهند داشت.
کمپانی AMD برای حل این مشکل طراحی بر اساس VLIW را کنار گذاشت و SIMD vector processor ها را جایگزین آن ها کرد.
از آنجا که قبلا در مورد SP صحبت کرده ایم حال در مورد نزدیک ترین جایگزین آن یعنی SIMD صحبت خواهیم کرد.
توجه داشته باشید که این معماری نباید با SIMD پیاده شده در Cayman ( که مجموعه ای از SP ها هستند ) اشتباه شود. SIMD پیاده شده بر روی معماری GCN یک 16-wide vector SIMD می باشد. یک دستور و حدودا 16 عنصر داده، تنها با یک سیکل کلاک می توانند توسط واحد vector SIMD پردازش شوند.. این واحد vector که با 64 KB حافظه Register نیز آمیخته شده یک واحد SIMD را در معماری GCN تشکیل می دهد.
Compute Unit
Compute Unit واحدی است که کمپانی AMD آن را واحد بنیادی محاسبات در معماری GCN می داند. از آنجایی که یک واحد SIMD فقط می تواند عملیات برداری را اجرا کند تعدادی واحد دیگر که محاسبه توابع دیگر را نیز بر عهده دارند در Compute Unit تعبیه شده اند تا از نظر محاسباتی واحد کاملی را پایه ریزی کنند و از پس محاسبه دستورالعمل های مختلف برآید. بنابراین همانطور که در تصویر زیر ملاحضه می کنید این واحد به مراتب با SIMD که در Cayman به کار رفته بود فرق می کند.
همانگونه که واحد SIMD به کار رفته در CAYMAN از تعدادی SP تشکیل شده در یک Compute Unit نیز 4 واحد SIMD به کار رفته است. این بدین معناست همانند یک SIMD به کار رفته در CAYMAN، یک CU با معماری GCN نیز می تواند بر روی 4 دستورالعمل در آن واحد کار کند. همچنین در این واحد قسمت های کنترل سخت افزاری نیز تعبیه شده اند. یک واحد branch unit که عهده دار واکشی ، رمزگشایی ، زمان بندی و برنامه ریزی wavefront ها و دستورالعمل هایشان است نقش مهمی را در این واحد بازی می کند.
حال که بیشتر با Compute Unit آشنا شدیم و از طرفی نقاط ضعف طراحی VLIW را هم می دانیم می توانیم به این سوال پاسخ دهیم که چرا AMD طراحی non-VLIW SIMD را جایگزین طراحی VLIW کرده است. همانطور که قبلا اشاره شد یک از ضعف های طراحی VLIW این بود که به صورت استاتیک و توسط کامپایلر برنامه ریزی می شد. در نتیجه در اکثر دستورالعمل ها از تمامی امکانات یک واحد VLIW استفاده نمی شد. در صورتی که در طراحی non-VLIW SIMD برنامه ریزی این واحد به جای کامپایلر توسط سخت افزار صورت می گیرد و این واحد CU می باشد که برنامه ریزی را در قلمرو خودش انجام می دهد.
پس در حال حاضر نوعی سنجش هوشمند توسط برنامه ریزی پویا سخت افزاری در معماری جدید به وجود آمده است که بسیاری از مشکلاتی که مربوط به ضعف بازدهی پایین VLIW بود را رفع خواهد کرد.
سوالی که ممکن است برای خیلی از خوانندگان در این موقیت پیش آید این موضوع می باشد که برنامه ریزی پویا و SIMD های مستقل در معاری GCN در عمل چه کارهایی می توانند انجام دهند که SIMD های CAYMAN که مجموعه ای از SP ها بودند نمی توانند انجام دهند ؟ خیلی ساده می توان گفت عملیات پیرامون دستورات غیر مستقل و برنامه ریزی آن ها با سرعت بیشتری صورت خواهد گرفت.
بدترین سناریو موجود برای VLIW این است که چیزی که برنامه ریزی شده است به طور کامل وابسته باشد و یا به نوعی دستورالعمل را قبل و یا بعد از آن مسدود کند. این دستور به هر حال به خودی خود اجرا می شود. در صورتی که GCN یک معماری نا منظم نیست. در داخل یک wavefront ، دستورالعمل ها هنوز هم باید به طور منظم اجرا شوند. بنابراین برای مثال نمی توان به یک باره از وسط یک برنامه pixel shader به بخش های دیگر آن دسترسی پیدا کرده و آن ها را اجرا کرد. در صورتی که در CU و SIMD ها می توان قسمت های مختلف wavefront را انتخاب و بر روی آن ها کار کرد. این wavefront می تواند زاده شده توسط یک Task مشابه نیز باشد.
حالت ایده آل معماری VLIW ( برای مشاهده سایز بزرگتر بر روی تصویر کلیک کنید )
حالت ناکارآمد معماری VLIW ( برای مشاهده سایز بزرگتر بر روی تصویر کلیک کنید )
Cayman روی هم رفته توانایی خیلی محدودی در انجام چندین کار با هم دارد در حالی که به راحتی بر روی چندین Wavefront در آن واحد پردازش لازم را انجام می دهد. توانایی انجام چند کار به صورت همزمان در Cayman متکی به پشتیبانی API بود که این موضوع نیز به گسترش OpenCL محدود می شد. حال با تغییرات سخت افزاری بنیادی، معماری GCN می تواند با راحتی هرچه تمام تر به طور همزمان بر روی چندین Task کار کند. هر SIMD به کار رفته در GCN قابلیت تغذیه 10 Wavefront را دارا می باشد. این بدین معناست که هر CU می تواند 40 Wavefront را به صورت همزمان پردازش کند. همین عامل می تواند دلیل مهمی برای جایگزینی طراحی non-VLIW به جای VLIW باشد.
در حالی که پشت سر گذاشتن اشکالات VLIW بزرگترین پیشرفت در معماری GCN برای افزایش کارایی کاربردهای computing محسوب می شود، طراحی non-VLIW علاوه بر داشتن مزیت های فراوان نسبت به طراحی قبل دارای کاستی هایی نیز می باشد. در واقع ما هنوز در مورد اجزاء دیگر واحد CU صحبت نکردیم. واحد "سنجشگر محاسبه و منطق" (Scalar ALU ) واحد جدیدی در GCN می باشد. این واحد علاوه بر اینکه دستورالعمل های ناکارآمد را خارج از SIMD نگه می دارد آن ها را به واحدهای vector ALU تحویل می دهد تا به صورت یکجا اجرا شوند. واحد سنجشگر (scalar unit )مرکب از یک scalar ALU به همراه 8KB حافظه register file می باشد.
بسیاری از Compute Unit ها یک GPU را می سازند
در حالی که واحد compute unit بخش بنیادی محاسبات در این معماری محسوب می شود ولی به خودی خود یک GPU نیست. بلکه همانند SIMD های CAYMAN بلاکی می باشند که قابلیت پیکربندی را برای تبدیل شدن به یک GPU بزرگتر دارا می باشد.
هر 4 واحد CU در کنار هم یک CU Array را می سازند. با در دست داشتن تعداد مناسبی از CU ها حال زمان آن است که به واحد های دیگر که GPU با معماری GCN را می سازند بپردازیم. در دیاگرم زیر می توانید نگاهی کلی به بخش های مختلف GPU با این نوع معماری داشته باشید.
از کنترلر حافظه و Cache که شروع کنیم در این معماری به ازای هر واحد کنترلر حافظه ( هر واحد دارای Interface 64 Bit می باشد) 64KB یا 128KB حافظه L2 Cache در نظر گرفته شده است. این بدین معناست که اگر Memory Interface را در این معماری همانند CAYMAN در نظر بگیریم ، 512 KB حافظه L2 Cache برای این معماری در نظر گرفته شده است. این حافظه Write-Back بوده و کاملا منسجم می باشد. یعنی همه واحد های CU به صورت مشترک به محتویات داخل آن دسترسی دارند. این حافظه مهمترین دسته اطلاعات را در خود جای می دهد تا برای واکشی آن ها کمتر به حافظه ها رجوع شود. همچنین هماهنگی بین CPU و GPU نیز در این حافظه صورت می گیرد.
همچنین Asynchronous Compute Engine های جدید AMD نیز به عنوان command processors برای کاربردهای Computing در این معماری عمل می کنند. هدف اصلی این ACE ها پذیرفتن کارها و انتقال آن ها به CU ها برای پردازش می باشد. یکی از اثرات وجود ACE ها در این معماری آن است که معماری GCN توانایی محدودی در اجرای دستورات نامنظم دارد و همانطور که قبلا به آن اشاره شد معماری GCN یک معماری منظم می باشد و رشته دستورالعمل ها در یک wavefront قابل منظم سازی نیست. ACE ها می توانند اولویت بندی Task ها را تغییر دهند و به آن ها این اجازه را می دهند تا در نوبت های دیگر اجرا شوند.
ویژگی های معماری جدید GCN
حال که مختصرا با جزعیات معماری جدید Graphics Core Next آشنا شدیم این سوال پیش می آید که این معماری در عمل چه طور کار می کند و چه قابلیت هایی دارد که CAYMAN و دیگر معماری های بر اساس طراحی VLIW فاقد آن ها می باشند ؟
معماری جدید GCN که همراه با ویژگی های جدید و قابلیت های نو در حیطه GPU Computing می باشد می توان آن را شریک خوبی برای پردازنده مرکزی ( CPU ) در بسیاری از کاربردها دانست.
از لحاظ ویژگی های پایه، بزرگترین تغییر آن خواهد بود که GPU های با معماری GCN از بسیاری از زبان های برنامه نویسی پیشرفته نظیر C++ و ... پشتیبانی خواهد کرد. این ویژگی به توسعه دهندگان این اجازه را می دهد تا به راحتی با زبان های برنامه نویسی سطح بالا GPU را با نرم افزارهایی که می نویسند Program کنند.
از آنجا که ویژگی های بنیادی به این معماری جدید اضافه شده زیرساخت های حافظه نیز باید تکامل یابند تا توانایی ارائه سرویس به این ساختار جدید را دارا باشند. یکی از مهمترین تغییرات صورت گرفته در این قسمت این موضوع می باشد که سخت افزار معماری جدید به گونه ای تطبیق داده شده تا از ISA جدیدی پشتیبانی کند که از حافظه یکپارچه استفاده می کند. این قابلیت به برنامه نویسان این اجازه را می دهد تا برنامه ای بنویسند که هم CPU و هم GPU را برای پردازش دستورالعمل ها هدف بگیرند.
همچنین برنامه نویسان می توانند برای دسترسی به حافظه به صورت مستقیم از هر قسمتی استفاده کنند بدون اینکه نیاز باشد قبل از کار بر روی آن، محتویات داخل آن را از جایی به جای دیگر کپی کنند ! این قابلیت در عمل و به ویژه در زمانی که حافظه مجزا تعبیه شده بر روی کارت های گرافیک کمتر از مقدار مورد نیاز برای اجرای دستورالعمل های پردازش تصویر است به توسعه دهندگان این اجازه را می دهد که از حافظه اصلی سیستم ( RAM ) به صورت مستقیم و با کارایی به مراتب بیشتر از معماری های پیشین بهره ببرند.
همچنین کمپانی AMD قابلیت ECC را نیز به این معماری اضافه کرده تا از قابلیت هایEDC (Error Detection & Correction )i قبلی این کمپانی نیز حمایت کند. این قابلیت صحت انتقال صحیح اطلاعات رو بر روی گذرگاه حافظه های GDDR5 تضمین می کند. لازم به ذکر است هر دو نوع حافظه SRAM و DRAM به کار رفته در این معماری از این تکنولوژی تصییح خطا پشتیبانی می کنند. برای حافظه های SRAM این چرخه تاثیری بر روی کارایی نخواهد داشت اما در حافظه های VRAM تا حدودی کارایی را کاهش خواهد داد.
منبع:شهر سخت افزار