دوشنبه 30 مهر 1397 | Monday 22 nd of October 2018 صفحه اصلی گروه الکترونیکی کامپیوتر
3-5-2- تردها، بلاک ها و گریدها: تطبیق الگوریتم ها با مدل کودا

     کودا از مفهوم سویچ های تک چرخه ای استفاده می کند تا تاخیر مسیر داده و دسترسی به حافظه را پنهان کند. وقتی از GPUهای سری NVIDIA G80استفاده می کنیم، نخ ها میان 16 چند پردازنده مدیریت می شوند، که هر کدام شامل 8 هسته SIMDهستند. متد مدیریت اجرا کودا تقسیم گروههایی از نخ ها در میان بلاک ها است. گریدها از مجموعه ای از بلاک ها تشکیل شده اند. نخ ها می توانند مکان خودشان را در یک بلاک و مکان بلاک درون گرید را با المان های داده ذاتی که بوسیله کودا مقداردهی اولیه شده اند مشخص کنند. نخ های درون یک بلاک می توانند با هم از طریق توابع سدی که توسط کودا فراهم شده است همزمان شوند؛ اما این امکان وجود ندارد که نخ های درون بلاک های مختلف مستقیما با هم همزمان شوند یا با هم ارتباط برقرار کنند. نخ های بلاک های مختلف متعلق به یک گرید می توانند از طریق عملیات اتمیک، در فضای حافظه سراسری که با بقیه نخ ها به اشتراک گذاشته اند هماهنگ شوند. گریدهای که بصورت ترتیبی به هسته وابسته هستند می توانند از طریق مانع های سراسری همزمان و از طریق حافظه اشتراکی سراسری هماهنگ شوند. برنامه های کاربردی که به خوبی به این مدل نگاشت شوند به علت درجه بالا موازی سازی سطح داده توانایی موفقیت بالایی با multi-GPUها دارند. زمانی که برنامه های کاربردی توانایی تقسیم به بلاک های مستقل را داشته باشند این مدل اجازه می دهد که اجرا روی چندین GPUنیز بخوبی انجام شود البته این حالت همیشه امکان پذیر نیست و برای اینکه این امر امکان پذیر باشد یک بلاک نباید روی بلاک دیگر تاثیر گذارد.

کودا از تعدادی از عملیات های اتمی پشتیبانی نمی کند اما این عملیات ها تنها روی مجموعه ای از GPUها در دسترس هستند. استفاده متناوب از عملیات های اتمی موازی سازی که GPUفراهم می کند را محدود می کند. این عملیات های اتمی مکانیزم های همزمانی بین تردهای درون بلاک های متفاوت است.

نخ ها

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

برخلاف مدل SPMTکودا، سخت افزار GPU NVIDIAبا استفاده از واحدهای چند پردازشی SPMDساخته شده است. نخ ها به گروههای 32 بیتی که  بسته[1] نامیده می شوند گروهبندی می شوند و به SPها نگاشت می شوند. یک بسته واحد پایه ای زمانبندی است. همه 32 بیت یک بسته هرچند داده انهامتفاوت است باید دستور یکسانی را اجرا کنند. یک نخ به یک SPنگاشت می شود. بسته ها بوسیله MIUها ساخته، مدیریت و زمانبندی می شوند. تعداد نخ ها در هر بسته معمولا دو برابر تعداد SPها است. تعداد نخ هایی که به یک بسته تعلق دارند با یک ادرس برنامه یکسان شروع می شوند و برای انشعاب و اجرا بصورت مستقل عمل می کنند.

چند پردازندهها هشت واحد تابعی( که هسته نامیده می شوند) دارند که بیشتر عملیات ها را در چهار سیکل تمام می کنند. در سیکل اول، هشت نخ اول(نخ های 7-0) داده خود را وارد خط لوله می کنند. این روند بوسیله یک سویچ متن که هشت نخ بعدی(نخ های 15-8) را فعال می کند ادامه می یابد. در سیکل دوم، این نخ ها (نخ های 15-8) داده خود را وارد خط لوله می کنند. گروههای سوم و چهارم نیز به همین ترتیب دنبال می شوند. در سیکل پنجم، نخ های اول نتایج خود را بدست اورده اند و اماده اجرا دستور بعدی هستند. اگر نخ های کافی برای پر کردن این 32 جای خالی در بسته وجود نداشته باشد این سیکل ها به هدر می روند.

MIUیک بسته را که اماده اجرا است انتخاب می کند و دستور بعدی را به نخ های فعال هر بسته می فرستد. یک بسته در یک زمان یک دستور مشترک را اجرا می کند، بنابراین کارایی کامل زمانی بدست می اید که همه نخ های یک بسته روی مسیر اجرایی توافق داشته باشند. اگرچه، نخ ها ازاد هستند که بصورت متفاوت اجرا شوند، اما وقتی این واقعه رخ دهد این ریسک وجود دارد که کارایی بطور جدی اسیب ببیند. علت ان این است که ناسازگاری روی جریان کنترل، زمانبند نخ را مجبور می کند که اجرا انها را سریالی کند.

مسلما، زمانی که بسته بصورت مستقل اجرا می شوند، سریالی شدن مسئله ای است که ممکن است فقط برای نخ های یک بسته یکسان رخ دهد. واگرایی انشعاب ها تنها علتی نیست که ممکن است منجر به سریالی شدن نخ ها شود. اگر یک دستور بوسیله یک بسته اجرا شده باشد، بدون توجه به اتمی بودن ان نوشتن در مکان یکسانی در حافظه اشتراکی برای یک یا بیشتر نخ های درون یک بسته بصورت سریالی انجام می شود. به این اثر جانبی تناقض بانک گفته می شود.

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

بلاک ها و گریدها

     در کودا، بلاک واحد قابل زمانبندی است که می تواند به یک چند پردازنده تخصیص داده شود. یک بلاک شامل تعداد صحیحی بسته است و در هر زمان حداکثر به یک چند پردازنده تخصیص داده می شود.

اگر چه بسته ها برحسب توان عملیاتی با اهمیت هستند، انها به طور موثر برای مدل برنامه نویسی شفاف هستند. در عوض،  کودا نخ ها را به ساختارهای (بلاکهای) یک، دو و سه بعدی مدل می کند که در واقع واحد قابل زمانبندی برای اجرا یک چند پردازندهها هستند. اگر همه نخ های یک بلاک منتظر یک خواندن یا نوشتن از حافظه با تاخیر زیاد باشند، سپس کودا ممکن است بلاک دیگری را زمانبندی کند تا روی چند پردازنده یکسانی اجرا شود. به هر حال، کودا فایل رجیستر یا کش اشتراکی را در زمان تعویض یک بلاک مبادله نمی کند بنابراین اگر یک بلاک جدید در زمانی که بلاک دیگر منتظر است اجرا شود ان بلاک می تواند با منابعی که هنوز در دسترس هستند کار کند.

زمانی که یک برنامه کودا که کرنل نامیده می شود روی GPUاجرا می شود هرنخ مشخصه مشخصی دارد که به طور پویا تعیین می شود. این مقادیر، هماهنگ کننده های بلاک خودشان در گرید و هماهنگ کننده های نخ خودشان درون بلاک هستند. یک تمرین عمومی برای نگاشت نخ ها به مجموعه های مسئله این است که یک نخ داشته باشیم که مسئول هر المان درون داده خروجی باشد. برای انجام این کار، ابعاد بلاک ها و نخ ها معمولا ابعاد مجموعه داده خروجی را نشان می دهند. در شکل 3-2 مفهوم نخ، بلاک و گرید به تصویر کشیده شده است.

شکل3-2- گریدها، بلاک ها و تردها

وقتی یک تابع کودا که بعنوان هسته شناخته می شود از برنامه اصلی فراخوانی می شود، با صدها ترد همزمان شروع می شود. هر چند پردازنده بطور مستقل تردها و بلاک تردها را مدیریت می کند.

هر چند پردازنده همزمان چندین بلاک ترد را بخوبی بسته های یک بلاک پردازش کند. هر چند پردازنده بوسیله پردازش SIMTمحدود شده است اما چند پردازندههای مختلف یک دستگاه کودا ممکن است در یک کرنل مسیر اجرا متفاوتی داشته باشند



[1]Wrap

Compatability by:
آخرین به روز رسانی سایت: سه شنبه, 22 اسفند 1391 - 00:26