باسلام خدمت تمامی دوستان در سایت تخصصی OverClockingHeroes چندی پیش احساس کردم که باید مقاله ایی ترتیب بدم در رابطه با مبانی اصلی کارت گرافیک
امیدوارم مفید واقع بشه .
به عنوان یک منتقد کارتهای گرافیکی براین عقیده هستم همواره باید مولف تسلط کامل بر مطالب خودش داشته باشه
ضمن اینکه دوست دارم در بهتر شدن این مقاله بهم کمک کنید ممنون.
داستان دقیقا از کجا شروع شد ؟
شرکت انویدیا در زمان حضوره G70 موفقیت هایی در دوره های کوتاه داشت و اما در همین نسل با شکست هایی سنگین در مواجهه با کارت های شرکت رقیب یعنی ATI داشت.در عصره X1900 Series انویدیا دچار شکست هایی بسیار سنگینی شد و x1950 xtx ضربه اخر این برند به پیکره انویدیا در زمینه پرفورمنس بود.اما انویدیا از مدت ها پیش بر رویه معماری کار میکرد که در ادامه به اون تسلا(tesla ) گفتن و نسل G80 شروع این معماری بود.این معماری به حدی پیشرفته بود که در ابتدایه عرضه موجب شوک رقبا شد و کارایی تا 3 برابر نسل پیشین طبق ادعای انویدیا داشت و از اخرین API شرکت مایکروسافت DX10 بهره میبرد.
برایه شروع و توضیح جدیدترین معماری فعلی انویدیا که ما اون رو فرمی میخونیم لازمه توضیحاتی درمورده معماری ابتدایی تسلا که فرمی هم از خانواده اونه بدم.
البته من قصد ندارم به طور دقیق بر رویه معماری G80 زوم کنم چون از حوصله بحث خارجه و اگر دوستان علاقه مند بودن من در یک تاپیک جدا گانه به بحث و تاریخچه پیدایشش میتونم اشاره کنم.
پیش از کودا کور ها انویدیا برایه پردازش دادها از هسته هایی به نامه SP که مخفف Streaming processor بود بهره میبرد.
خوب متاسفانه sp ها کاملا از خط لوله پردازش تشکیل شده بودن.یک عمل به sp فرستاده میشد و توسط دو ALU و یک FPU مرحله خواسته شده عملوند رو پردازش و انجام میداد.داده های Integer و floating point احتمالی اون هرکدوم در ALU مربوط پردازش و واحد FPU یا Floating point unit داده هایه ممیز شناور سنگین رو از خط لوله پردازش عبور میده و پردازش میکنه.در این نسل sp یک مشکلی وجود داشت و اون نداشتن حافظه سریع catch بود.این به این معناست که این پردازش گر به طور ویژه به درد پردازش های سنگین عملیات ریاضی میخورد نه چیزه دیگر.به همین علت هر sp بسیاری از وقت خودش رو صرف کار رویه پیکسل ها و ورتکس ها(رئوس) میکرد.که این باعث میشد نداشتن کش اونقدرها هم برای SP مهم نباشه.
میشه اینطورعنوان کرد که sp ها مدل بسیار ساده شده SPE های پردازش گر CELL درPS3 بودن یا حتی میشه گفت SPE ها مدل ساده SM های انویدیا هستن که در ادامه درموردشون توضیح میدم.
SP ها از جنس پردازش گر هایه نرده ای یا اسکالر(Scalar) هستن و عملکرد این نوع پردازش گرها جای صحبت زیاد داره که از حوصله تاپیک خارج است.
در مقابل اسکالر ها ابر اسکالر ها یا super scalar ها هستن که ati قدیم یا amd فعلی از اون برایه gpu هاشون استفاده میکنن.که مزایا و معایب خودشونو دارن.اگر دوستان مایل بودن در تاپیک جداگانه ای در اینمورد به طور اختصاصی بحث میکنیم.
برگردیم به بحث:
خوب تا حدودی با عملکرد sp ها اشنا شدیم.اما درواقع sp ها به طور خاص قابله استفاده نیستن و در ساختار بزرگتری درون sm یا streaming processor مورد استفاده قرار میگیرند.
Sm ها در واقع ارایه ای از sp ها هستن.مثلا در نسل G80/G92/GT200 در هر SM 8 عدد sp قرار داشت که توضیحشون رو در ادامه میدم.
خوب معماری sm در نسل تسلا قبل یعنی gt200 و g80 که درشکل زیر مشاهده میکنید:
هر sm متشکل از 8 پردازنده جریانی یا همون sp streaming processor و به همراه 2 پردازنده چند منظوره خاص SFU که مخفف Special function unit هست.
SFU شامل 4 واحده ضرب ممیزشناور(Floating point or FP- Multiply) هست که برایه عملیات هایه خاص غیره جبری مثله محاسبه سینوس یا کوسینوس و... به کار میرود.مورده بعد برایه پردازش داده هایی مثله Anistropic texture ******ing استفاده میشه.هرچند انویدیا در این مورد به طور مشخص صحبت نکرده.اما فکر میکنیم هر SFU به طور کامل از خط لوله(Pipeline) تشکیل شده یعنی یک-عمل/یک-دستور یا عملوند که سرانجام نتیجه را به ما میدهد.
در SM ما واحده MT Issue رو میبینیم که وضیفه ارسال دستورالعمل ها رو به واحد هایه sp و sfu در گروه داره.
علاوه بر پردازش گرهایی که در sm وجود داره.یک حافظه کش عملیاتی کوچک وجود داره که در شکل I Catch میبینیم که مخفف instruction catch هست و داده هایه فقط خواندنی ذخیره میشود.یک حافظه هم خواندنی هم نوشتنی read/writeshared memory با حجم 16 kb هم وجود دارد که داده های اشتراکی sp ها در اون قرار میگیرد.
حافظه catch به طور هدفمندی کوچک طراحی شده چون برخلاف روال میکروپردازنده های دکستاپ داده هایی که قرار است در این قسمت ذخیره شوند بسیار کوچک اند.
حال بیایم کمی از بالاتر به ساختار تراشه ها نگاه کنیم.در اینجا ما TPC یا Texture/pixel Cluster رو مشاهده میکنیم.
همونطور که میبینید ساختار کلی دونسل GT200 و G80/G92 بسیار به هم شبیه.علت این مورد ایجاد ساختاری ماژولار توسط انویدیا برایه طراحی اولیه تسلا هست که موجب شد G80 باکمی تغییر و بزگ شدن به GT200 تبدیل شود
ماژولار بودن کلاسترها یا خوشه ها در تسلا به این معنا بود که هرتعداد SM میتونستن در خوشه قرار بگیرند و این موجب این شد در نسل G80/G92 2عدد SM قرار گیرد اما در GT200 3 عدد SM در خوشه جای بگیرند.
ساختار کلاستر ها در GT200 انچنان تغییری نکرد.اجزایه اون شامل SM ها و تعدادی کنترل منطقی یا Logic control و البته بلاک تکسچر.
بلاک تکسچر یا texture block خود شامل texture addressing و fiilter logic هست که در ادامه خدمت دوستان بیشتر توضیح میدم.
ساختار به کلی ماژولار تسلا اولیه به نامه SPA یا Streaming processor arrayموجب شد انویدا برایه گسترش این معماری برتر با مشکلات کمی روبه رو بشه.
شکل زیر ساختاره یک G80 که نسل اولیه تسلا هست رو نشون میده:
ساختار TPC یک G80 رو که خدمت دوستان توضیح دادم.این GPU شامل 8 عدد TPC بود که در هرکدام از TPC ها2 SM یعنی مجموعا 128 SP و 32 SFU که با 754 Million ترانزیستور ایجاد شده بودند.
حال ببینیم GT200 که انویدیا GT اون رو به نام Graphics TESLA نام گذاری کرده بود چگونه است:
خوب میبینیم از 10 فروند TPC بهره برده که هر TPC شامل 3 عدد SM هست پس این GPU دارای 240 SP و 60 تا SFU هست.با توجه با این مشخص براورد کلی افزایش قدرت 87.5 % رو نسبت به G80 شاهد هستیم.
این هم چارت عملکردی GT200 در مجاورت باقیه اجزایه GPU و پل شمالی:
برای اشنایی با عملکرد این GPU توضیحاتی میدم.در قسمت جلویی GPU ما زمانبند ها (Schaduler) وکنترل منطق logic control رو داریم که برایه توزیع حجم کار ها در تمام ارایه هسته های پردازشی به کار رفتن.در قسمت دیگر ما حافظه های تکسچر کش سطح 2 L2 Texture catch که برای ضخیره سازی بافت ها به کار میرن و واحد های پردازشگر تصویر یا همون rasterization processos که تصویره نهایی رو از الگویه شبکه داخلی inter connection network و حافظه های DRAM گرفته و مراحل پایانی فیلـــترینگ و خروج داده ها و ارسال به فریم بافر frame buffer انجام میشه.
این بود توضیحی مقدماتی رویه نسل اولیه و ثانویه تسلا که در ادامه به اخرین نسل اون یعنی فرمی میپردازیم(نسل بعد معماری انویدیا کپلر نام دارد که اطلاعات دقیق از اون دردسترس نیست)
Nvidia Fermi with cuda core
انویدیا با تاخیری 6 ماهه نسبت به رقیب کارت هایه مبتنی بر فرمی رو وارد بازار کرد.اما علل این تاخیر از طرف این شرکت با توجه به تغییرات اساسی معماری قابل بخشش هست از اون جمله میتوان به اضافه کردن واحد هایه پولیمورف انجین در هر sm که دقیقا به منظور براورده کردن خواسته های نسل اتی API مایکروسافت یعنی DX11 بود انجام گرفت.
بیایید با هم به برسی وتاریخچه شکل گیری این پردازشگر پیشرفته بپردازیم:
انویدیا در ابتدا فرمی را به دومنظور طراحی کرد
1:فرمی برای کار در ابر کامپیوترهای تسلا (Architected for tesla)
2:فرمی برایه صنعت بازی(Architected for gaming)
معماری هردو بخش یکی هست اما بنده قصد دارم در هردو مورد توضیحاتی رو بدم اما تمرکز اصلی مقاله رویه صنعت بازی هست.
Architected for tesla
برخلاف رقبایه انویدیا که به طور مشخص بر این موضوع تاکید دارن که پردازشگر ها اینده رو برایه ماروشن نگه میدارن.انویدیا خلاف این موضوع رو عنوان میکنه.بر اساس تئوری کلی و اولیه این شرکت تعداد زیادی پردازنده ضعیف و کم سرعت که داده ها میانشون تقسیم میشن کار هارو بسیار سریعتر از تعداد کمی کارگر با سرعت بسیار زیاد انجام میدن.
به طوره کلی نحوه گسترش gpgpu بر این اساس هست که کارها و وظایف بین چندین پردازنده کم سرعت تقسیم بشه و این باعث میشه کارها با سرعت بسیار بالاتری انجام بگیره.طبق ادعایی که چندی پیش انویدیا عنوان کرده بود gpu ها میتونن تا 200 برابر سریعتر از cpu ها باشن که در یکی از کنفرانس هایه اینتل این موضوع با اختلاف زیاد با عدد عنوان شده تایید شد و انویدیا از اینتل حتی با همین حد اقرار هم تشکر کرد.
طبق همین تئوری انویدیا از گذشته هایه دور در فکر جاگزین کردن gpu در پردازش گر هایه ابر کامپیتور ها شد و کودا با معماری نوین فرمی شروع قدرتمند این مورد بود.همونطور که اطلاع دارید چندی پیش سریعترین ابر کامپیتوتر جهان در چین با نام tinahe 1-A که از 7168 پردازنده TESLA M2050 که معادل GFORCE اون میشه GTX470 تشکیل شده که در صدر پرقدرت ترین ابرکامپیوتر هایه جهان قرار گرفته.
نحوه گسترش معماری فرمی بر این اساس بود که هر یک از اجزا حتی sm ها به طور ماژولار عمل کنن و هریک بتونن در غیاب اجزای دیگه به کار خودشون ادامه بدن.بر همین اساس انویدیا میتونه تراشه فرمی رو تنها با یک sm راه اندازی کنه چون به طور مستقیم به بخش راستر متصله و interconnect network هم در sm قرار داره که باعث میشه بدون نیاز به کلاستر (cluster) کارشو انجام بده.
تسلا در واقع بخش پردازش بازدهی بالا یا high performance compute انویدیا هست که در ماژول های مختلف و حتی شامل 4 gpu به مشتریان عرضه میشه.در ابر کامپیوتر ها پردازش هایه مربوط به اشکال رو در سطح صنعت بازی هایه کامپیوتری نداریم به همین سبب در سری TESLA M2050 به موتور پردازشگر اشکال POLYMORPH ENGINE که در اون واحد تسلیتور مربوط به DX11 وجود دارد در بسیاری از SM ها نیازی نیست پس در مصرف زیاد این GPU که بخش زیادی از اون در این بخش صرف میشود صرفه جویی شده و ابر کامپیوتر ها مصرف کلی پایین تری پیدا میکنند.
البته بعضی از وظایف پردازشگر اشکال ممکنه در مراحل gpgpu نیاز شود که در اون صورت pe وارد عمل میشود.
انویدیا به مشتریان خودش این GPU هارو همراه با بسیاری از اجزایه دیگه به شامل حافظه هایه سریع ddr ویا حتی فلیپ فلاپ های فوق سریع مربوط به ابرکامپیوتر ها در ماژول هایی به نامه TESLA SUPER COMPUTER یا COMPUTING CLUSTER عرضه میکنه
تصویره بالا مربوط به C1070 هست که شامل فرمی نیست و از GT200 تشکیل شده اما تمام اجزایه مورد نیاز یک خوشه پردازش تسلا درش وجود داره.
در این مقطع به علت شباهت بسیار زیاد و تنها تفاوت هایه نرم افزاری بینه دو بسط فرمی یاد شده.یه ادامه بحث در بخش طراحی برایه بازی هایه کامپیوتر میپردازم تا گسستگی مطلب پیش نیاد.و مقاله بصورت فوق حرفه ایی روند خودشو طی بکنه .
Nvidia Fermi Architecture
پیش از توضیح در مورده کلیات این GPU لازمه یاداوری کنم قصد دارم با توضیحاتی از جزء معماری به کل معماری برسم.پس باید از کوچکترین عضو معماری که بنیان اون هست شروع کنم و به کلیت کار خوشه ها بپردازم تا با دستاورد عظیم انویدیا بهتر اشنا بشیم .
CUDA Architecture
فرمی از هسته های کودا تشکیل شده که این هسته ها در داخل sm قرار میگیرند.تمام این هسته براساس استاندارد IEEE 754 که توسط انستیتو مهندسین برق و الکترونیک برای عملیات ریاضی در مورده ممیز هایه شناورFP و Full 32 bit integer مقرر شده انجام میگیرد.
من قصد دارم جزء به جزء اجزایه این تراشه رو خدمت دوستان توضیح بدم چون اعتقاد دارم این مقاله باید بطور دقیق روی جز به جز موارد توجه داشته باشیم.
سعی میکنم بصورت حرفه ایی به عملکرد هسته بپردازم .
با نگاهی کاملا دقیق .
در تصویره بالا شمای کلی یک هسته کودارو مشاهده میکنید.برخلافه نسل پیش که از sp هایه ساده تشکیل شده بودن و توضیحاته کاملشو در بخش اول مقاله خدمت دوستان دادم هسته کودا بسیار بهینه تر و پیچیده تره:
: dispatch port وظیفه ای مشابه خوشه(cluster) دسته بالا یعنی sm داره با این تفاوت که تنها وظیفه ارسال/دریافت داده به کودا کور هایه همسایه و شبکه ی بین هسته هارو داره.
Operand collector: وظیفه جمع اوری عملوند ها و ارسالشون به ALU مربوطه برای پردازش داره که بسته به ویژگی داده ها اعم از ممیز شناور یا ثابت به ALU مربوط میفرسته.
FP/INT Unit:عملوند ها به دودسته ثابت یا INTEGER ویا ممیز شناور Floating Point تقسیم میشن که oc بنا به ویژگی به ALU مربوط برایه پردازش میفرسته. ALU که مخفف Arithmetical logic unit هست از مجوعه ای از Gate هایه منطقی تشکیل شده که مجموع اونها ایجاد 1 یا چند خط لوله پردازشی یا pipeline میکنن.عمل و دستورالعمل ها با تغییر در ولتاژ پایه این گیت هایه منطقی عملیات پردازشی رو در خط لوله پردازش انجام میده که این تنها توسط ترانزیستور هایه بیشمار 40nm که ساختار ALU رو تشکیل دادن ممکنه.به طوره کلی ورودی و خروجی هر ALU شامل عملونده که از Operand collector میگیرد و اعمال میشه و دیگری که شامل code یا همون issue ای هست که از واحد کنترل control unit برایه پردازش استفاده میکنه و نتیجه رو به result queue میفرسته.
البته این نکته قابله ذکره که از نظره بسیار از مراجع FPU ها بسیار پیچیده تر از ALU های رایج هستن و برخلافه اکثره ALU هایه معمول که از سیستم Two,s compliment یا متمم 2 استفاده میکنن اینها از داده هایه بسیار پیچیده ممیز شناور برایه عملیات پردازشی بهره میگیرند که موجب میشه هر FPU از چندین مدار پیچیده داخلی یا Complex circuit برایه ارتباط Multiple internal ALU,s استفاده کنه و همین باعث میشه صرف یک ALUاون رو حساب نکنیم.
این موضوع برای اولین بار در یک سایت ایرانی توسط من مطرح شد
ALU INT هم طبق گفته انویدیا برایه داده های 64-BIT و دقت بالاتر برای انجام عملیات ها بهینه شده.همچنین از متد FMA یا Fused multiply add برای داده های double and single precision استفاده میکنه.
همونطور که گفتم نتیجه پردازش FP/INT Unit به result queue یا صف انتهایی میرسه که توسط واحده اعظام یا شبکه داخلی برایه ادامه عملیات مورد نیاز جذب میشه.
SM in Fermi
واحده SM در فرمی دچار تغییرات بنیادین شده و میشه اونو یک پردازشگر کاملا خودکفا دونست .این سومین نسل ارتقاء یافته sm از دوره تسلا اولیه یعنی G80 هست . علاوه بر اون یک پردازشگر کاملا جدا به نامه polymorph engine هم برایه وظایف dx11 به sm اظافه شده که توضیحات کامل اونو خدمت دوستان خواهم داد.
از اونجایی که قول دادم جزء به جزء معماری فرمی توضیح بدم لازم هست کلیاتی رو درمورده دستورالعمل ها یا instruction ها خدمت دوستان بدم.
در دنیای پردازش های گرافیکی ویا مربوط به GPGPU داده ها به شکل دستورالعمل یا instruction به حافظه گرافیک ارسال میشن. بعد از ارسال حجم عظیم دستورالعمل های ارسالی که از سطح کرنل گرفته میشه حافظه GDDRAM قسمتی ازاون هارو به GPU ارسال میکنه که در کنترلر حافظه برسی و به حافظه کش سطح 2 و سپس به حافظه کش سطح 1 میرسه.
دستورالعمل ها در قسمتی به نامه INSTRUCTION CATCH ارسال میشه تا برایه مراحل بعدی پردازش اماده بشه که شما در بالاترین قسمت SM اون رو مشاهده میکنید.کش دستورالعمل باید بسیار سریع باشه طوریکه تماما از لچ ها( Flip-Flop )باید ساخته شده باشن.
نکته خیلی خیلی مهم:
دستور العمل ها برایه اینکه قابله پردازش توسط هسته ها باشن باید به شکل ترد یا thread در بیان که این مورد از وظایفه warp scheduler هست.
Warp scheduler : که یکی از مهمترین بخش های sm هست و عملکرد اون همراه با dispatch unit هست که سرنوشت عملکرد تراشه رو میتونه رقم بزنه.البته عملکرد کلی این واحد در GIGA Thread Engine که بعدا توضیح خواهم داد مدیریت میشود.
Warp چیست؟ یا Warp از نگاه یک منتقد کارتهای گرافیکی . قبل از اینکه توضیحاتی رو درمورده ریسمان ها خدمت دوستان بدم لازمه چند مورد رو بدونیم.مکانیزم های SIMD و MIMD :
SIMD & MIMD mechanism
در متد های پردازشی یا multiple processingما دو مکانیزم رو مد نظر قرار میدیم . یا ریزتراشه ای براساس عملکرد SIMD یا بر اساس عملکرده MIMD که هرکدوم رو تا حدی برایه دوستان توضیح میدم.
SIMD :
در این نوع عملکرد ما ساختاره single instruction , multi data داریم . به این معنا که دستور عمل هایه مشابه به چندین پردازش گر به طور همزمان و سنکرون ارسال و چندین نتیجه برایه ما حاصل میشه. SM هایه NVIDIA و AMD از این دسته هستن.
MIMD
در این متد که تقریبا مقابل مکنیزم SIMD هست ما ساختاره multiple instruction , multiple data داریم که به این معناست چند دستور العمل غیره متشابه به چندین دسته پردازشگر غیره همزمان(غیره سنکرون یا Asynchronous ) و غیره متشابه ارسال و سپس چندین نتیجه برایه ما حاصل میشه..
ما میتونیم SPE های پردازشگر CELL که مخفف synergistic processing element هستن از خانواده پردازشگرهایه آسنکرون نام ببریم.این نوع پردازشگر ها مشکلاته زیادی سر راهشون هست که از جمله اونها میتونیم به سخت بودن برنامه ریزی برای عملکرده هر هسته یا عدم همزمانی اتمام عملیات هر هسته که موجب میشه بعضی هسته ها در انتظار صف خروجی باشن و همین باعث میشه بهینه عمل نکنن از جمله بزرگترین مشکلات سر راه این حالت از پردازشگر نام ببریم .این نوع پردازشگر ها مزایایی هم دارن که از جمله اونها میشه به سرعت بسیار بسیار بالایه پردازش ها در صورت بهینگی برنامه ریزی هریک از هسته ها نام برد.
همونطور که خدمت دوستان عرض کردم مجموع CUDA Core ها در SM ها عملکردی SIMD دارن به همین خاطر برایه ایجاد Parallel computing صحیح میان تمام 32 هسته هر sm واحد هایی به نامه warp scheduler نیاز هست که دستور العمل هارو به صورت ترد ها thread زمان بندی و میان هسته ها تقسیم میکنه.
حال ببنیم warp ها چی هستن؟
در تحقیقی که من انجام دادم دست یافتم
ورپ یا ریسمان طبق بیان دپارتمان دانشگاه بریتیش کلمبیا university of british Columbia (UBC) به این صورت معنا شده: Threads group into a SIMD Instruction که همین بیان ساده شمای کلی عملکرد SM رو توضیح میده.زمانبند ریسمان درواقع وظیفه دسته بندی دستورالعمل ها به صورت ترد Thread داره که این مهم به صورت 2 مراحله زیر انجام میگیرد:
شمای کلی یک ریسمان به شکل زیر است:
ادامه مقاله در پست بعدی