نگاهی دقیق به Nvidia Fermi در پردازش گرافیکی-صفحه 1


نگاهی عمیق به معماری Nvidia Fermi در پردازش گرافیکی


تألیف و ترجمه : بابک ولی زاده


حقوق این مقاله برای سایت انیمیشن دیتا محفوظ است



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


ساختار درونی Fermi


نسخه کامل پردازنده گرافیکی  جدید GF100 نام گرفته است که مخفف نام Graphic Fermi است. این پردازنده گرافیکی از بخش اصلی به نام GPC  یا (Graphics Processing Cluster) تشکیل شده و هر کدام از آنها دارای اجزای اصلی سازنده پردازنده گرافیکی است (تصویر 1). این اجزاء شامل Raster Engine، حداکثر چهار SM یا (Streaming Multiprocessor) است. در این میان، هر SM نیز خود دارای 32 واحد سایه زنی (یا طبق نامگذاری NVIDIA همان هسته های CUDA)، چهار واحد Texture مجزا و یک Polymorph Engine است. با یک حساب سر انگشتی به این نتیجه میرسیم که در پردازنده گرافیکی Fermi در کل 512 هسته CUDA وجود دارد (در حال حاضر کارت گرافیک GTX 580 که از معماری بهینه شده GF100 و با نام GF110 استفاده میکند، دارای 512 هسته CUDA است).
 

تصویر 1



در کل 48 واحد ROP در GF100 برای کارهایی همچون ترکیب پیکسل ها، Anti Aliasing و عملیات های مربوط به حافظه وجود دارد. ROP ها در شش گروه هشت تایی قرار داشته و هر گروه با یکی از کنترلر های حافظه 64 بیتی در ارتباط است. ROP ها، حافظه L2 Cache و کنترلر های حافظه در نزدیکی یکدیگر قرار گرفته اند.
واحدهای Texture در هر SM به 16 کیلوبایت حافظه L1 Cache دسترسی داشته و 768 کیلوبایت حافظه L2 Cache نیز برای تمامی اجزای GF100 از جمله Texture ها در دسترس است. واحد های Texture نیز از فرمت های فشرده سازی جدید مورد استفاده در DirectX11 نیز پشتیبانی میکنند. و هر واحد میتواند در هر کلاک یک آدرس texture را پردازش کرده و 4 نمونه از texture ایجاد کند.
هر هسته CUDA دارای واحد محاسبات منطقی (ALU) و واحد ممیز شناور (FPU) است. در GF100 از نسخه جدید IEEE 754-2008 در ممیز شناور استفاده شده است که در نتیجه آن امکان استفاده از دستورالعمل های FMA در محاسبات فراهم میشود. FMA باعث بهبود اجرای دستورالعمل های ضرب-جمع (MAD) شده و بدون از دست رفتن دقت در محاسبات، در یک مرحله عملیات جمع و ضرب صورت میگیرد. همچنین FMA خطا هایی که ممکن است از رندر مثلث های Overlap شده در تصویر ایجاد شود را به حداقل میرساند.
واحد محاسبات منطقی اعداد صحیح (integer ALU) از دستورالعمل های 32 بیتی به طور کامل پشتیبانی کرده و با نیاز های زبان های برنامه نویسی استاندارد کاملاً هماهنگ است. همچنین این قسمت توانایی پشتیبانی از دستورالعمل های 64 بیتی را نیز دارد.

 


یک قدم به سوی واقعیت


در کارت گرافیک جدید، NVIDIA به چیز هایی فراتر از یک پردازش گرافیکی ساده فکر کرده است و حالا پردازش های عمومی کارت گرافیک (GPGPU) نیز نقش مهمی در کارت های گرافیک پیدا کرده اند. ایجاد حجم ها و اشیاء واقع گرایانه از دیگر اهداف NVIDIA بوده است که اشاره زیادی به آن شده است. هدف NVIDIA از ارائه این بحث نزدیک شدن هر چه بیشتر به محیط های واقعی در بازی های کامپیوتری از رویکرد نور پردازی و ایجاد سایه ها (مانند آنچه در فیلم ها می بینیم) است که باید با استفاده از برخی تکنیک های خاص این موارد را برآورده کرد (تصویر 2).
 

تصویر2



دو روش اصلی برای رسیدن به اشیاء واقعی تر، استفاده از Tessellation و Displacement Mapping است. به طور ساده می توان گفت که Tessellation بر اساس یک الگو یا یک طرح، مثلث های بزرگی را که یک شی را میسازند، به قطعات بسیار کوچکتر تقسیم کرده و سعی میکند پستی و بلندی های واقعی تری از حجم مورد نظر ایجاد نماید. Displacement Mapping نیز به کمک Tessellation آمده و محل قرار گیری هر یک از مثلث های تازه ساخته شده را تعیین میکند.
انجام این کار به توان پردازشی بسیار بالایی نیاز دارد و فعال کردن Tessellation کارایی را به طرز قابل توجهی کاهش می دهد. از اینرو NVIDIA پردازشگر هایی به نام PolyMorph Engine در نظر گرفته که میتوانند پردازش های مورد نیاز این قسمت را انجام داده و در نتیجه در مقایسه با کارت های گرافیک رقیب (یعنی سری HD 5000 و HD 6000) کارایی بهتری از خود نشان دهد.



ساختار PolyMorph Engine و Raster Engine


پنج بخش Vertex Fetch، Tessellation، Viewport Transform، Attribute Setup و Stream Outputدر PolyMorph Engine وجود دارد (تصویر 3). نتایج هر یک از این پنج بخش به یک SM ارسال شده و پس از اجرای سایه زن های مورد نظر در آن قسمت، خروجی به بخش بعدی PolyMorph Engine فرستاده میشود. ابتدا رئوس حجم مورد نظر از یک بافر مخصوص به Vertex Fetchوارد میشود. این رئوس به SMفرستاده میشود تا با عملیات Vertex Shader اسکلت اجسام ساخته شود. در این پروسه،  فاکتور های مربوط به Tessellation نیز محاسبه شده و به بخش Tessellator ارسال میشوند. با توجه به اطلاعات مربوط به Tessellation، سطحی متشکل از نقاط کنترلی مختلف ساخته میشود.

 

تصویر3



رئوس جدید دوباره به SM فرستاده میشوند تا Domain Shader و Geometry Shader بر روی آنها اجرا گردد. سپسDomain Shader محل نهایی هر راس را بر اساس ورودی های مراحل قبلی تعیین میکند. در این مرحله از یک الگو نیز استفاده میشود تا بتوان جزئیات بیشتری را اعمال کرد. Geometry Shader نیز در مواقع لازم عملیات Post Processing و اضافه و حذف کردن رئوس را انجام میدهد. نتایج برای بررسی نهایی به Tesselator ارسال میشود تا در صورت تایید به Viewport Transform منتقل شوند تا مسیر دید و پرسپکتیو اصلاح شود. سپس در Attribute Setup نتایج مرحله قبلی در معادلات ساده ای قرار میگیرند تا اعمال Shader ها بر روی آنها بصورت بهینه تری انجام شود. در نهایت رأس های مورد نیاز از طریق Stream Output و برای اعمال پردازش های بیشتر به حافظه ارسال میشوند.
به گفته NVIDIAاین نوع طراحی باعث میشود تا بتوان پردازش های مربوط به این بخش را بصورت موازی انجام داد و این کار تأثیر بالایی در کارایی و رسیدن به کیفیت بالای تصویر و واقعیت هرچه بیشتر محیط گرافیکی مورد نظر ما است.


استفاده از این روش بیشتر در CPU های امروزی مشاهده میشود که با این روش امکان اجرای موازی دستورالعمل ها و در نتیجه افزایش کارایی نهایی میسر است. دستیابی به این سیستم بسیار مشکل است، زیرا تنها برخی از دستورالعمل ها را میتوان خارج از نوبت و بصورت موازی پردازش کرد (معمولاً اجرای یک دستورالعمل نیازمند انجام عملیاتی از قبل است تا با کمک نتایج آن عملیات بعدی صورت گیرد). با این حال نمیتوان GF100 را پردازنده ای دانست که 100% از این روش پشتیبانی میکند.
پس از پردازش اطلاعات در PolyMorph Engine، داده های بدست آمده به Raster engine ها ارسال میشوند تا پیکسل های نهایی برای نمایش بر روی مانیتور آماده شوند.
 

تصویر4



در کل چهار واحد پردازشگر Raster Engine در پردازنده گرافیکی GF100 وجود دارد. Raster Engine شامل بخش های Edge Setup، Rasterization (پردازش اطلاعات برداری و تبدیل آن به تصویر پیکسلی) و z-cull است (تصویر 4). در قسمت Edge Setup مکان های برداری تعیین شده و لبه مثلث هایی که قرار است تصویر را تشکیل دهند پردازش شده و مثلث هایی که بیننده آنها را نخواهد دید حذف میشوند. این قسمت در هر کلاک میتواند یک نقطه، خط یا مثلث را پردازش کند. نتایج این بخش به Rasterizer ارسال شده و در هر کلاک هشت پیکسل از تصویر تولید میشود. در صورتی که antialiasing نیز فعال باشد، در این قسمت پردازش های مربوط به آن صورت میگیرد. پیکسل های ساخته شده به z-cull منتقل شده و عمق هر پیکسل با آنچه در حال حاضر در حافظه موجود است مقایسه میشود.
 

تصویر5

 



نتیجه در عمل


تصاویر 5 و 6 نمونه خوبی از تأثیر Tessellation در رسیدن به تصاویری واقعی تر را نشان میدهند. همانطور که در تصویر 5 مشاهده میشود، فعال سازی Tessellation، پستی و بلندی های روی تپه را به شکل واقعی تری نشان داده و حرکت آب که شبیه سازی آن یکی از سخت ترین کارها است، با فعال سازی Tessellation ظاهر واقعی تری به خود گرفته است. شبیه سازی مو در تصویر 6 نیز بسیار واقعی تر از زمانی که Tessellation  غیر فعال است صورت میگیرد.
 

تصویر6




بهبود کیفیت تصاویر
داشتن  کیفیت بالاتر تصویر از دیگر وظایف اصلی کارت های گرافیک و طراحان آنها به شما می آید.یکی از این روش ها Gather 4 نام گرفته است که به ایجاد تصویری یک دست تر (مخصوصاً در سایه ها) کمک میکند. در این روش لبه سایه ها (و دیگر موارد مشابه) با بررسی پیکسل های مشابه اطراف آن به شکل زیباتر و دقیق تری به تصویر کشیده میشوند.

 

                      صفحه1          صفحه2             عناوین مطالب

 

آمار بازدیدکنندگان

آنلاین: 7
امروز: 18
دیروز: 199
ماه: 4431
سال: 34447
کل: 216596
آخرین بازدید: 1:26