1:کنترل جریان ترد های Threadدرون ریسمان : ( Control flow threads into a warp )
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
همونطور که میبینید زمانبند ریسمان ترد هارو ایجاد ودر میسره هسته ها بر اساس عملیاتی که میخواسته روشون انجام بگیره رها کرده:
اینجا مشکلی مرسوم پیش میاد به نامه واگرایی شاخه ها یا branch divergence که زمانی اتفاق میوفته که ترد هایه درون ریسمان به مسیرهایه اجرایی یا execution path های متفاوتی برن همونطور که درشکل بالا میبینید حدوده 50% از ترد ها دچار واگرایی شدن .
معمولا برای حل این مشکل از سیستم چند ریسمانی یا multiple warp استفاده میکنن که نمونش رو در شکل زیر میتونید ببنید
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
همونطور که میبینید با این تکنیک بیش از 30% در راندمان GPU بهبود ایجاد کردند(برسی موتورگرافیک بازی ها هم منجر به ایجاد بهینگی هایی از این دست برایه بالابردن سرعت پردازش میشود) دقیقا همون چیزی که با رامین اکبری همیشه سرش بحث و گفتگو میکردیم.
2:اجرایه تیرد هایه عددی درون ریسمان : Execution of scalar thread in warp))
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
طبق شکل بالا براساس معماری پایه ای کامپیوتر دستورات عددی به این صورت به gpu ارسال و سپس بر اساس شکل زیر به خطوط لوله پردازشگر SIMD ارسال میشوند.دستورات از طریق cpu ارسال و gpu وظیفه مالتی ترد کردن وریسمان سازی رو انجام وسپس ترد ها بین هسته ها تقسیم و پردازش و سپس نتیجه نهایی به cpu برای ارسال به ram برای نمایش نهایی انجام میشود.همانند شکل.
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
خوب این از توضیحاته مربوط به زمانبند ریسمان که خدمتتون ارائه دادم دیگه ازین ساده تر نمیتونستم بهش بپردازم . اگر سوال اضافی از این قسمت داشتید خوشحال میشم پاسخ گو باشم چون این قسمت تقریبا از مهمترین قسمت هایه sm هست .
حالا بیایم به sm یکبار دیگر نگاهی بیاندازیم:
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
همونطور که میبینید در فرمی ما 32 هسته کودا داریم.برایه اینکه تردهای درون ریسمان به خوبی بین هسته ها ی کودا تقسیم بشه انویدیا تصمیم گرفته هسته هارو به 2 قسمت 16 تایی تقسیم کنه وبرایه هر کدام یک warp scheduler قرار بده.این به این معناست که هر زمانبند ریسمان در هر ریسمان 16 ترد ایجاد میکنه و به 16 هسته کودا تقسیم میکنه. که مجموع 2 زمانبند کل هسته هارو پوشش میدن.البته زمانبد ریسمان ها داده هایه اختصاصی مثل محاسبه سینوس یا لگاریتم یا تانژانت و.... رو به SFU ها که توضیحاتشو قبلا در بخش GT200 خدمت دوستان داده بودم ارسال میکنن. البته SFU ها یا همون Special function UNIT در FERMI بسیار قویتر شدن و از 2Pipline در gt200 به 4 pipeline در fermi تبدیل شدن.
مورده بعد dispatch unit هست که توضیحاتشو در قسمت زیر خدمته دوستان میدم:
Dispatch unit : همونطور که در قسمت بالا خدمت دوستان توضیح دادم هر warp شامل چند Thread و هر ترد شامل چندین instruction یا دستورالعمل هست.
واحد اعظام هم ریسمان هارو از طریق ارسال به ریجستری انجام میده و این هسته ها شروع به کار میکنن. به ازای هر زمانبند ریسمان یک واحده اعظام وجود داره که عملکرده اسکالری هسته هارو تایید میکنه و 16 ترد داخل ریسمان طبق سلسله مراتب حافظه کش به هسته ها ارسال میشن.
قسمت بعد که میخوایم راجع بهشون صحبت کنیم واحد های خطی یا linear هستن که ثبات ها و پردازشگر هایه تکسچر از اون جمله اند.
TEX & texture catch :
در دنیای داده های DYNAMIC که بخش اعظم ترد هایه گرافیکی رو شامل میشه ما داده های رفتار خطی زیادی داریم که Texture ها بخش اعظم اونها هستن.تکسچرها از اونجایی که تنها برورویه سطح triangle ها پیاده سازی میشن و داده های ثابت و رفتاری خطی linear دارن اما بسیار پر حجم هم هستن و نیاز به واحدی اختصای برایه این منظور دارن که واحد های پردازش تکسچر و کش تکسچر این مهم رو به انجام میرسونن.
uniform catch :ساختار حافظه ای فرمی بر اساس عملکردی به کلی سلسه مراتبی یا hierarchy با حافظه اشتراکی هستن که حافظه کش سطح 1 بسیار پر سرعت برای انجام عملیات های درون sm و ارتباط بین کور ها از طریق شبکه داخلی به کار میروند.یونیفرم کش برایه ارتباط بین این دو به کار میرود.
در ادامه به ساختار تماما سلسله مراتبی فرمی برایه حافظه ها اشاره خواهم کرد.
64KB Configurable Shared Memory and L1 Cache:
در واقع یکی از کلید های نواوری و موفقیت های برنامه پذیری یا( programmablity )و بازدهی (performance) یک اپلیکشین GPU حافظه اشتراکی هست.حافظه اشتراکی در واقع اجازه میدهد بلاک تیرد هایی که به طور همسان یا BLOCK SAME THREAD هستن به صورت همکار (CO OPORATION) اجرا شوند , تسهیل برای انجام مجدد سطح گسترده ای از داده های روی مموری اشتراکی.و کاهش شدید ترافیک چیپ در هنگام خاموشی المان ها هست.در واقع حافظه اشتراکی کلید اجرای بسیار از کودا اپلیکیشن CUDA Application ) )ها هست.
در نسل G80-GT200 تنها یک حافظه اشتراکی 16kb وجود داشت.در معماری فرمی بنا به گسترش sm یک حافظه 64kb قابل پیکربندی یا configure ability هست که بنا به نیاز سخت افزاری سطح کرنل kernel instead struction قابلیت پیکربندی به شرایط زی رو داره:
48KB of Shared memory with 16 KB of L1 catch : 1
16 KB of Shared memory with 48 KB of L1 cache : 2
همینطور که ملاحظه میکنید میزان سطح 2کش در فرمی برابر با 768KB شده که فوق العاده کمک میکنه به فرمی. بقیه مشخصات هم واضح توضیح داده شده.
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
16 Load/Store Unit: (LD/ST)
واحد هایه سبز رنگی که بین cuda core ها و SFU ها هستن ودر SM به شکل LD/ST میبینیم درواقع واحد هایه ذخیره و بازیابی هستن.هر یک از این واحد ها محاسبه مبدا و مقصد ادرس ها برای 16 ترد در هر کلاک به کار میرن که بخوبی از عهده کارشون برمیان .
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
بدلیله اینکه این قسمت بارها مورد بررسی قرار گرفته و بسیار کلیشه ایی شده و واقعا در حد توضیح و بررسی در مقاله نیست فقط اشاره کمی میکنم به
مراحل کاری Polymorph Engine
یا همان موتور پردازشی اشکال که در واقع میشه گفت اطلاعات مربوط به شکل و اجزای هندسی اشیاء رو محاسبه و پردازش میکنه که در ابتدا بواسطه TESSELLATOR همان گونه که در مقاله نگاهی به DX11 توضیح دادم حدفاصل راس ها رو پر میکنه که باعث ایجاد حجم در اشکال میشه بعد با قسمتی روبرو هستیم بنامه transform viewport که درین قسمت هم اندازه و جای دقیق انها روی صفحه مشخص میشه .و بعد دوباره در attribute setup یکسری خصوصیات ویژه که اشکال نیاز دارن مورد پردازش قرار میگیره و اطلاعات پردازش شده فرستاده میشه به so یا همون stream output که بعد خارج میشه که در شبکه با هم ادغام میشن . ابته توضیحی در رابطه با raster engine هم بدم که متشکل از سه قسم هست که وظیفه اصلیش تنظیم کیفیت اجسام پردازش شده و جایگاه شون روی مونیتور دقیقا اول گوشه های اجسام تنظیم میشه بعد rasterrizer یه اسکن خطی از کلیت کار اجام میده .
Total Fermi architecture
همونطور که قبلا خدمت دوستان عرض کردم قصده بنده این بود که از معماری جزء فرمی به کل معماری اون برسم که از پردازشگر های کودا شروع و سپس به SM رسیدم وحال به طراحی کلی وکلاستر ها و حافظه مشترک وگیگا ترد انجین خواهیم رسید.
به گفته انویدیا فرمی اولین معماری تراشه GPU ای هست که از سلسله مراتب صحیح حافظه کش True cache hierarchy در ترکیب با حافظه اشتراکی مقیم چیپ on-chip shared memory داره.درواقع عملایت کودا کور ها با استفاده از معماری بینظیر این کارت میتونن از تمام فضای کش ها و مموری های اشتراکی بهره ببرن.به این سیستم که برای اولین بار در فرمی به کار رفته NPDCC یا NVIDIA Parallel Data Cache Configurable گفته میشود. در ادامه به توضیح این متد میپردازم:
NVIDIA Parallel Data Cache with Configurable L1 and Unified L2 Cache
پیش از اینکه توضیح تخصصی در مورده این متد خدمت دوستان بدم لازمه کمی کلیت عملکرده این مکانیزم رو برایه دوستان واظح روشن کنم.
به تصویره زیر دقت کنید
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
همونطور که میبینید حافظه کش سطح 1 مشغول تبادل اطلاعات بین L1 Cache و کوداکور هاست.در بخش قبل خدمت دوستان توضیح دادم که کش سطح L1 کاملا قابل پیکر بندی هست و بسته به نیاز SM میتونه دو نوع Config داشته باشه(دونوع کانفیگ در بخش قبل ذکر شده)
48KB of Shared memory with 16 KB of L1 catch : 1
16 KB of Shared memory with 48 KB of L1 catch : 2
این نوع عملکرد باعث 2 نوع بهینگی میشه:
1:پهنای باند کلی SM افزایش پیدا میکنه Improve Bandwith)) که این امر موجب سریعتر شدن عملکرد حافظه ها و ارجاع دهنده ها میشه.
2:کاهش زمان تاخیر حافظه L1 cache میشود Reduce latency)) که این مهم تنها از طریق قابل پیکر بندی بودن حافظه میسر میشود.
تصویره زیر نحوه ارتباط کل CUDA CORE ها در GPU درون کلاستر ها و با حافظه L1 Cache داخلی sm رو نشون میده:
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
خوب حالا بیایم برایه حافظه کش سطح 2 چه اتفاقی میوفته: L2 Cache configuring))
به تصویر زیر دقت کنید:
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
همونطور که میبینید یکی از کودا کور ها به طور مستقیم داده ای رو با کش سطح 2 که excute شده در حال اشترک گذاری هست.عملکرده سلسه مراتب Hierarchy)) فرمی در این سطح کش باعث ایجاد سرعت بالاتر همگرایی (coherent) داده های اشتراکی در این سطح میشه.
تصویره زیر نحوه ارسال و دریافت داده های اشتراکی بین هردو سطح کش L1 وL2 هستیم.
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
خوب برگردیم به نحوه عملکرد کلی NPDCC:
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
در دنیای پردازش های گرافیکی و GPGPU همگرایی داده ها یکی از مهمترین ارکان افزایش سرعت شبکه داخلی پردازشگر هستش که به انجام رسوندن صحیح اون نیاز به عملکرده هوشمندانه ادوات ذخیره/ بازیابی یک GPU داره.
عملکرده صحیح اون موجب افزایش کارایی در برنامه های مربوط به پردازش هایی مثله ray tracing , fluid computing و... میشه.
یکی از مشکلات معمول سر راه این مهم عدم اشتراک گذاری درست منابع ذخیره سازی است.در حین اشترک گذاری منابع ذخیره سازی ما ناخوداگاه پایه ایجاد بسیار از مشکلات رو ایجاد میکنیم.این مشکلات میتونن به شکل زیر باشن:
بعضی از الگوریتم ها به طور طبیعی به هنگام عملیات اجرایی نیاز به اشتراک گذاری حافظه دارند .بعضی دیگر نیازمند حافظه سریع کش هستند و بعضی دیگر در انه واحد نیازمند هر دوی این متدها هستن.
در فرمی OMH یا optimal memory hierarchy اجازه میده ویژگی های هردوی shared memory و cache هارو با هم داشته باشیم.
در حقیقت:
The Fermi architecture addresses this challenge by implementing a single unified memory request path for loads and stores, with an L1 cache per SM multiprocessor and unified L2cache that services all operations
میرسیم به موتور مدیریت دستورالعمل های کرنل که اثر مستقیم بر ریسمان ها داره و از مهمترین امکانات فرمی هستش:
GIGA Thread Engine
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
خوب میرسیم به یکی از مهم ترین بخش هایه فرمی که سرنوشت کیفیت اجرایی هسته ها به طور مستقیم به این بخش مربوط میشه.
این موتور در نسل G80 معرفی شد و میتونست 12.888 ترد رو مدیریت کنه.موتور گیاگا ترد در فرمی از لحاظ سرعت مدیریت تفاوت چندانی با نسل G80 نداره اما چیزی که اونو متمایز کرده 10 برابر شدن سرعت سویچینگ متن هستش (Application Context Switching).
همونطور که در توضیحات sm خدمت دوستان عرض کردم واحده warp scheduler از دستورالعمل ها ترد و ترد هارو به ریسمان تبدیل میکنه و سپس در طول array cuda ها میفرسته.
عملکرد صحیح و بهینه این بخش بستگی به عملکرد giga thread داره و عملیات این واحد دستورات لازم به زمانبند ریسمان رو میده تا چگونگی عملکرد کلی ریسمان ها تایین بشه.
برایه متوجه شدن عملکرد این موتور به تصویره زیر دقت کنید:
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
در اینجا شما دونوع مرحله اجرایی هسته یا کرنل Kernel میبینید.اجرای سری یا serial و اجرای همزمان شده یا concurrent که در سمت راست تصویر هست.
یکی از وظایف مهم این موتور همزمانی هسته های اجرایی هست که هرچه بهینه تر باشند سرعت عملیات بالاتر میرود.انجام صحیح این مورد بستگی به عملکرده نرم افزاری درایور داره که برایه الگوریتم های جدید چگونه انجام بازخانی و synchronize سازی داده هارو به انجام برسونه.
از مواردی که به همزمان سازی داده ها کمک شایانی میکند IMT یا intelligently manage thread هست که جدید ترین مکانیزم مدیریت ترد ها است.
میرسیم به عملکرد مهم memory controller یعنی ECC که در ادامه توضیح میدم:
ECC Support
انویدیا برای افزایش باز دهی و تاثیر گذاری 512 هسته کودا که دائما در حال بارگذاری و اجرای داد ها هستن از مکانیزم تصصیح خطا استفاده کرده که این مهم در کنترلر (Memmory controller )حافظه انجام میگیرد.
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
Ecc که مخفف error code correction هست به منظور درست کردن خطاهای احتمالی در ترد های ها هست که برای اولین بار در فرمی پیاده سازی شده و درواقع فرمی اولین gpu هست که از این متد ECC برای رفع خطاهای احتمالی استفاده میکند.
به تصویره زیر دقت کنید:
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
مموری کنترلر یک خطا از سطح L1 یا L2 تشخیص داده پس بر اساس الگوریتم های عیب یاب خطای ecc پیش از تاثیر گزاری بر عملکرد gpu اون رو تصصیح میکنه
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
در اینجا کل مموری کنترل ها در یک loop چک شده اند و این عملیات از نو در طول حافظه ها پیگیری میشود.
پیش از اتمام مقاله لازمه درمورده nvidia nexus توضیحاتی رو بدم
Nvidia NEXUS
بطور خلاصه اشاره کنم که : انویدیا نکسوس در واقع اولین گستره و بستر نرم افزاری برای اپلیکیشن های کودا و نرم افزار های قابل ساپورت اون از جمله c , c++ , opencl , directcompute , …. هست که پلی است میان برنامه نویس و کودا کور برای رسیدن به قدرت بی همتایه کودا کور ها که از جمله قابلیت های کودا کور ها اجرای مستقیم کد های c بدون نیاز به المانی دیگر است و این یعنی یک برنامه نویس 512 هسته برایه اجرای توابع مورد نیاز خود در اختیار دارد.
سخن پایانی:
به جرات میتوان گفت تراشه فرمی پیشرفته ترین GPU و حتی تراشه ساخت دست بشر با توجه به ویژگی های ارزنده ای که دارد نام برد چون این پردازنده شگفت انگیز تنها برای پاسخ گویی نیاز های صنعت بازی طراحی نشده.بخش عمده طراحی این GPU برای کار در زمینه های GPGPU Progrraming که توسط سری qouadro این نیاز برطرف میشود و مورد اصلی اون عملکرد تراشه در ابرکامپیوتر های تسلاست.
با وجود بیرقیب بودن انویدیا در زمینه gpu supercomputer ها انویدیا بخش زیادی از سود خود را در این صنعت بدست میاورد.همونطور که دیدیم بیش از 7000 تراشه ابر کامپیوتر تسلا m2050 در سریعترین ابر راینه جهان tianhe 1-A به کار رفت و همگام با CPU های XEON شرکت اینتل کسب موفق ترین تراشه GPU)) به خاطر ایجاد سریعترین ابر کامپیوتردرزمینه ابرکامپیوترها رو بدست اورد
امیدوارم از خواندن این مقاله لذت کافی رو برده باشید و مفید بوده باشه. هرگونه سوالی در این زمینه با روی باز پاسخ داده خواهد شد .
موفق باشید
توجه:
هرگونه استفاده ازین مقاله فقط با ذکر نام نویسنده VFSDF مجاز میباشد.
نویسنده : وحید
ممنون برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید






پاسخ با نقل قول
Bookmarks