درود فراوان خدمت دوستان.
جمع کردن یک سیستم به طور منطقی با انتخاب قطعات مختلف و تحقیق در اینترنت برای آگاهی از کیفیت و کارایی اون ها شروع میشه و برای هر سیستم با توجه به کاربرد کاربر باید قطعات متفاوت انتخاب بشن، و هر کاربردی نیازمند یک کانفیگ مجزا از کاربرد دیگه هست.
این مقاله برای اطلاع یافتن از نحوه تاثیر گذاری هر قطعه در کارایی سیستم نوشته شده و در طول مقاله به مسیر پردازش گرافیکی توسط قطعات مختلف، انواع Bottleneck (گلوگاه) های موجود در مسیر و موارد با اهمیت زیادی که در کارایی یک کامپیوتر تاثیر میگذارند خواهیم پرداخت.
به دلیل کامل بودن پردازش بازی و کاربردی بودن آن، در طول تاپیک به کار ها و پردازش هایی که در طول اجرای یک بازی انجام میشود میپردازیم.
یکی از مهم ترین عواملی که در بنچمارک ها و به طور کلی، پرفرمنس سیستم تاثیر میزاره بحث Bottleneck هست که لازم دونستم قبل از این که بحث رو شروع کنم توضیحی کلی از "گلوگاه" ارائه کنم:
Bottleneck یا گلوگاه چیست؟
یک ساختمان که در حال ساخت هست رو در نظر بگیرید. برای ساخت ساختمان به منابع و عوامل متعددی از جمله مصالح مورد نیاز، کارگران، و... نیاز است.
اگه ما تعداد معدودی کارگر داشته باشیم(برای مثال 10 کارگر) که با مصالحی که در اختیار دارن شدیدا مشغول انجام کار هستند، هر چه قدر مصالح رو افزایش بدهیم پیشرفتی در کار مشاهده نمیشود، چون میزان مصالح فراتر از توان کاری کارگران است. در صورتی که اگه مقدار کمی مصالح و تعدادی کارگر به مجموعه اضافه کنیم شاهد افزایش سرعت در انجام کار هستیم.
در این جا تعداد و قدرت کارگران Bottleneck یا گلوگاه مجموعه مورد نظر است.
در بنچمارک گیری و به طور کلی، پرفرمنس یک کامپیوتر نیز بحث Bottleneck دقیقا به همین صورت وجود دارد که در ادامه به آن پرداخته خواهد شد.
توضیحی کلی و مختصر از نحوه پردازش یک فریم
هنگامی که یک بازی رو اجرا میکنیم، داده ها و اطلاعات از هارد درایور سیستم لود میشوند و به RAM منتقل میشوند، سپس اطلاعاتی که CPU به آنها نیاز دارد فراخوانده و پردازش میشوند. سپس داده ها به کارت گرافیک فرستاده شده، پردازش های لازم بر روی آنها صورت گرفته و در نهایت تصویر مورد نظر از طریق پورت تصویر کارت گرافیک به نمایشگر منتقل و نمایش داده میشود.
حال به طور جزیی تر به تک تک این مراحل و گلوگاه های موجود در مسیر میپردازم:
Storage
هارد درایور اگر از نوع مکانیکی و مدل های کم سرعت باشد میتواند در پردازش وقفه ایجاد کند، معمولا هنگام لود شدن مناطق جدید در بازی ها احساس تیک و افت فریم شدید کرده اید که این ناشی از وقفه ایست که انتقال اطلاعات از هارد به رم به وجود میآید.
در صورت استفاده از SSD های پرسرعت، این مشکلات کم تر به وجود میآیند و همچنین سرعت Loading بازی ها و نرم افزار ها به طرز قابل توجهی کاهش پیدا میکند.
RAM
رم سیستم نیز اگر دارای حجم کافی نباشد میتواند مشکلی مشابه را به وجود بیاورد و باعث ایجاد تیک و کند شدن سیستم گردد، البته رم های با سرعت بالاتر(Bus و Timing) میتونن سرعت انتقال داده ها رو افزایش بدن و در فریم ریت اثر مثبت ایجاد کنند.
در سیستم های بسیار گرون قیمت بهتره از رم با Bus و Timing مناسب استفاده بشه تا فریم ریت بالاتری از سیستم دریافت بشود. البته تاثیر این مورد بسته به گیم و نرم افزار مورد نظر میتواند کم یا زیاد باشد، همچنین پلتفرم سیستم نیز اهمیت زیادی دارد چون نحوه اثر گذاری این موارد وابستگی بسیار زیادی به CPU و Memory Controller آن دارد.
همان طور که مشاهده میکنید اورکلاک CPU نیز در تاثیر رم بر فریم ریت تاثیر میگذارد.
CPU Bottleneck و به طور دقیق تر، شرایط Compute Bound
هنگامی که پردازنده در حالت نهایت پتانسیل خود مشغول به کار است و به عبارتی، پردازش های بعدی نمیتوانند بلافاصله پردازش شوند (به دلایل مختلف اعم از مشغول بودن تمامی واحد ها، فرمان های I/O و...)، در این حالت وضعیت Compute Bound صورت گرفته و CPU کامپیوتر نوعی Bottleneck ایجاد کرده است.
این وضعیت معمولا در گیم هایی پیش میاد که نیازمند Allocation شدید Data ها به GPU برای پردازش هستند یا گیم هایی که نیازمند پردازش های خاص در خود CPU به مقدار فراوان هستند مثل سیستم های هوش مصنوعی پیچیده یا پردازش های فیزیکی.
به طور دقیق تر، این وضعیت هنگامی پیش میاید که CPU نتواند به مقدار کافی GPU رو تغذیه کند که در این حالت بخشی از توان GPU نیز به هدر میرود. نوع تنظیمات گرافیکی بازی ها هم در این مورد بسیار مهم است برای مثال در رزولوشن و تنظیمات پایین این اتفاق بیشتر میافتد زیرا بار پردازشی GPU کمتر شده، میتواند تعداد فریم بسیار بیشتری تولید کند وبه عبارتی GPU به دیتا های بیشتری از CPU نیاز دارد زیرا GPU عامل محدود کننده نیست و تا حد توان خودش فریم تولید میکند.
اما در رزولوشن و تنظیمات بالا معمولا عامل محدود کننده GPU هست زیرا پردازش های گرافیکی سنگین تر شده و تعداد فریم ها هم کمتر میشوند که به این معناست که تخصیص داده ها نسبت به تعداد فریم های خیلی زیاد، کمتر میشود. البته در این نوع تنظیمات بعضی پردازش های اضافه ممکن است به گردن CPU افزوده شوند و حتی در برخی گیم ها در این تنظیمات نیز CPU عامل محدود کننده باشد، ولی صورت کلی مسئله به این صورت است.
به این بنچمارک از بازی Dirt 3 دقت کنید که در شرایط Compute Bound گرفته شده:
و همان بنچمارک در شرایط GPU Bound:
[Data Allocation یا "تخصیص داده ها" به چه معنی است؟]
GPU باید به وسیله دستوراتی که CPU براش ترجمه کرده تغذیه بشه، به فرستادن داده ها دستورالعمل های ترجمه شده توسط CPU به GPU تخصیص داده ها یا Data Allocation گفته میشود.
دستورات مورد نظر توسط PCI-Express Controller که معمولا داخل خود CPU قرار دارد به سمت GPU فرستاده میشوند.
PCI-Express Bottleneck
این درگاه میتواند برای داده های در حال گذر گلوگاه ایجاد کند، PCI-Express با توجه به ورژن و تعداد Lane اون میتونه پهنای باند متفاوتی داشته باشد که در تصویر مشاهده میکنید:
توجهتون رو به بنچمارک های سایت Anandtech که در رزولوشن 1680X1050 و با کارت AMD Radeon HD7970 گرفته شدن جلب میکنم:
همون طور که مشاهده میکنید برای اکثر گیم ها اسلات PCI-Express 3.0 4X یا معادل اون PCI-Express 2.0 8X برای اکثر گیم ها کفایت میکنه. ولی برای رکورد های اورکلاک یا کاربرد های محاسباتی کارت گرافیک قطعا این پهنای باند Bottleneck (هر چند اندک) ایجاد میکنه و در اون شرایط بهتره حداکثر پهنای باند برای کارت گرافیک فراهم بشود.
Video RAM
بعد از اسلات به کارت گرافیک میرسیم، اطلاعات معمولا پس از ترد بندی GPU(که در ادامه به آن میپردازیم) و قبل از نمایش داده شدن بر روی Display در حافظهای به اسم Video RAM ذخیره میشوند. تفاوت اساسی VRAM با DRAM های معمول، Dual Port بودن اون هست که باعث میشود همزمان بتواند با 2 Device ارتباط برقرار کند و عمل Read/Write رو انجام بدهد بدون این که تداخلی به وجود بیاید(چیزی که در کارت گرافیک و رابطه بین GPU/VRAM بسیار نیاز هست)
VRAM کارت گرافیک ها با توجه به نیاز GPU اون ها تعبیه میشود، و برای مثال یک کارت Low End نیازی به VRAM با حجم 2GB که کارت HD6970 از همین مقدار VRAM استفاده میکند، ندارد! البته برخی تولید کنندگان کارت های ارزان قیمتی مثل HD5450 که جزو ضعیف ترین کارت های این نسل حساب میشوند را با حجم مموری بالا عرضه میکنند و به دلیل این که معمولا در بازار و به دلیل ناآگاهی خریداران، ملاک اصلی قدرت VGA رو حجم رم اون فرض میکنند(!)، مصرف کننده های بی اطلاع به این وسیله دچار گمراهی فراوان میشوند.
اصولا VRAM به هیچ عنوان نمیتونه ملاک قدرت یک کارت گرافیک باشه، به همان دلیل که هیچ گاه قدرت و سرعت یک ماشین رو با حجم باک بنزین اون نمیسنجند!
VRAM یک کارت میتونه از انواع مختلف DDR3,GDDR4,GDDR5,XDR2 و ... باشه که سرعت، پهنای باند، مصرف برق، نوع سیگنال و ... اون ها با هم متفاوت است.
در چه زمانی VRAM به Bottleneck تبدیل میشود؟
به طور کلی در گیم ها عناصری که بیشترین حجم VRAM را استفاده میکنند Texture ها، رزولوشن بالا(به علت ذخیره فریم ها در این رزولوشن)، Anti Aliasing (مخصوصا حالت هایی که از روش Up-Scale,Down-Scale استفاده میکنند) و برخی عوامل دیگه هستند، و این به آن معناست که در گیم هایی که از این قابلیت های به وفور استفاده میکنند نیاز به VRAM بالاتر هست.
Memory Interface
اطلاعات برای رسیدن به منابع GPU باید از گذرگاه(هایی) در GPU به نام Memory Interface یا Memory Controller عبور کنند.
یک GPU دارای تعدادی گذرگاه هست و هر گذرگاه دارای عرض مشخصی است که از جمع اون ها، عرض کلی یا Bus Width میرسیم.
برای مثال کارت GTX 580 که از GPU GF110 بهره میبرد دارای 6 عدد Memory Controller 64 بیتی هست که جمعا دارای 384bit Bus Width میشود.
اما پهنای باند مموری یک کارت که از مموری DDR (با هر ورژنی غیر از GDDR5) استفاده میکند به این صورت محاسبه میشود:
فرکانس مموری پایه*2(به خاطر Double Data Rate بودن)*Bus Width تقسیم بر 8(تبدیل بیت به بایت)
در GDDR5 :
فرکانس مموری پایه*2(به خاطر DDR بودن)*2(به خاطر مموری GDDR5 (توضیح در
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
داده شده))*Bus Width تقسیم بر 8(تبدیل بیت به بایت)
صورت کلی پردازش در GPU
این قسمت ارتباط چندانی به موضوع بحث تاپیک ندارد ولی لازم دونستم که این موضوعات رو مطرح کنم، چون پیش زمینه بحث های تخصصی تر در این زمینه ها هستند.
این تصویر صورت کلی پردازش گرافیکی یک گیم را در GPU نشان میدهد، ابتدا مثلث های 3 بعدی وارد GPU شده، پس از اتمام مراحل Geometry Processing به صورت 2 بعدی و سپس به صورت پیکسل های در کنار هم قرار گرفته درمیآیند.
پردازش گرافیکی در GPU از دید فنی
قسمتی از GPU که مستقیما داده ها رو از CPU دریافت میکند Thread Scheduler نام دارد، در Thread Scheduler (که در GPU های AMD به نام Command Processor و در GPU های Nvidia به نام Giga Thread Engine شناخته میشود) ترد هایی که از CPU به GPU رسیده دوباره و از نو زمان بندی میشوند و به سوی Execution Unit ها(یا در برخی مواقع VRAM) فرستاده میشوند.(از این مرحله به بعد، Nvidia و AMD و دیگر شرکت ها تفاوت های فراوانی با هم دارند که در صورت اشتیاق دوستان بعدا به توضیح آن موارد نیز خواهم پرداخت)
در ضمن در پردازش، واحد موتور گرافیکی GPU نیز به طور مرتب با هسته ها تعامل دارد و مرحله به مرحله به هسته ها دستورات را ابلاغ میکند، لازم به ذکر است که دستورات معمولا از Vertex Fetching (مراحل جای گذاری رئوس مثلث ها) شروع شده و با Stream Output اتمام میابند و مراحل دیگری نیز در این میان وجود دارند(از جمله Tessellation در کارت های با پشتیبانی از DirectX11)
دقت کنید که پردازش موازی گرافیکی در AMD و Nvidia تفاوت های زیادی دارند از جمله متد پردازشی که در Nvidia بر اساس Thread Level Parallelism و در AMD بر اساس Instruction Level Paralellism هست و بسیاری از عوامل دیگه که بهشون در این جا نمیپردازم.
پس از مراحل مختلف نوبت به عملیات Rasterization میرسه که باید فضای 2D رو به صورت پیکسل ها در بیاورند تا قابل نمایش بر روی Display باشد، و پس از اعمال Texture ها و Rasterization نوبت به Post Processing Effects میرسد که به معنی افکت ها و قابلیت های گرافیکی هست که بعد از Pixelated شدن قابل اجرا هست مانند Anti Aliasing، Motion Blur و ...
پس از این که تمامی پردازش ها انجام شدند، تصویر نهایی به صورت یک فریم به Framebuffer فرستاده شده و در آنجا ذخیره میشوند، سپس فریم ها پشت سر هم از طریق پورت کارت گرافیک(DVI,VGA,HDMI) به صفحه نمایش فرستاده و نمایش داده میشوند.
در این قسمت اگه به تبدیل آنالوگ به دیجیتال نیاز باشد مثل زمانی که از پورت VGA به مانیتور LCD/CRT استفاده میشود، داده ها باید از طریق RAMDAC (Random Access Memory Digital to Analog Convertor) تبدیل و سپس نمایش داده شوند.
GPU Bottlenecks
در GPU عوامل متعددی میتوانند به گلوگاه تبدیل شوند:
- واحد های ROP(Render Output) در رزولوشن های بالا
- واحد های TMU(Texture Mapping Unit) در گیم های با تعداد تکستچر بسیار بالا
- واحد های Graphics Engine که اکثرا در پردازش Tessellation محدودیت ایجاد میکنند
- واحد های Tessellator در عنوان هایی که از تسلیشن با فاکتور بالا و به طور وسیع استفاده میکنند در صورتی که این قسمت در GPU نتواند جوابگو آن حجم دستوردهی باشد (این مورد و مورد بالایی به هم بسیار مربوط هستند)
- و در نهایت واحد های پردازشی ALU,FPU ها یا همون هسته ها
که مجموعا اگر یک یا تعدادی از این عوامل رخ دهند، پردازش GPU Bound نام میگیرد.
البته لازم به ذکر است که عملیات های درون GPU بسیار پیچیده هستند و خیلی از موارد ناگفته مانده، و مواردی که در بالا ذکر شد عمده مواردی هست که باعث افت فریم و موراد مشابه میشوند.
با تشکر از این که وقتتون رو برای خواندن این مقاله صرف کردید، امیدوارم مفید واقع شده باشد.
لطفا هر گونه سوال یا ابهامی در مورد این مقاله و در این زمینه رو در همین تاپیک مطرح کنید.
منابعی که از آن ها برای نوشتن این مقاله استفاده شده است:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
(صفحات مختلف)
[NVIDIA’s Next Generation CUDA Compute Architecture:Fermi [Whitepaper
Tri Do Dinh, GPUs - Graphics Processing Units,Institute of Computer Science, University of Innsbruck ,July 7, 2008
و برخی منابع دیگر.
پیروز باشید.