جمعه 29 دی 1396 | Friday 19 th of January 2018 صفحه اصلی گروه الکترونیکی کامپیوتر
7ـ2ـ2 موج دار کردن (ایجاد حلقه های موجی در)GPU با استفاده از رشته ها

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

     

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

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

کلاس فراخوانی می شود.

 اگر چه این تابع تنها شامل چهار خط میشود ولی همه انها دربرگیرنده مفاهیممهم CUDA Cهستند. ما در وهله اول دو متغیر دو بعدی، بلوکها و رشته ها را اعلام کرده بودیم. بنا به انچه که کنوانسیون نامگذاری با زحمت بسیار اشکار ساخته است، بلوک های متغیر نشان دهنده تعداد بلوک های موازی میباشند که ما در شبکه راه اندازی کرده ایم.رشته های متغیر نیز نشان دهنده تعداد رشته هایی هستند که ما در هر بلوک راه اندازی خواهیم کرد.از انجا که ما در حال تولید یک تصویر هستیم، میتوانیم از نمایه سازی دو بعدی بنحوی استفاده کنیم که هر رشته از یک شاخص منحصر به فرد (X، Y) که براحتی قابل مطابقت بایک پیکسل در تصویر خروجی باشد، برخوردار گردد.

   ما استفاده از بلوکهای حاوی ارایه 16× 16 رشته ها را برمیگزینیم. اگر تصویر دارای پیکسل های  DIM×DIM باشد، به راه اندازی بلوکهای DIM/16 * DIM/16  جهت حصول یک رشته در هر پیکسل نیاز است.شکل 5ـ2 نحوه ای که این بلوک و پیکربندی رشته در یک تصویر (بطور مضحک) کوچک با عرض 48-پیکسل و ارتفاع 32 پیکسل بنظر میرسند را نشان می دهد.

شکل 7ـ2 یک سلسله مراتب دو بعدی ازبلوک ها و رشته های مورد استفاده در پردازش یک تصویر48 * 32  پیکسلی با استفاده از یک رشته در هر پیکسل.

ممکن است در صورت انجام هر گونه برنامه نویسی چند رشته ای واحد پردازنده مرکزی، این سوال در ذهن شما مطرح شود که چرا می خواهیم این تعداد بسیار زیاد از رشته ها را راه اندازی کنیم.به عنوان مثال، این روش بمنظور رندر کردن یک انیمیشن1920 ×1080با کیفیت و وضوح بالاشروع به ایجاد بیش از 2 میلیون رشته میکند.  اگرچه ما به طور معمول به ایجاد و برنامه ریزی زمانی این تعداد فراوان از رشته ها در  GPUمبادرت میورزیم ولی رویای ایجاد این تعداد رشته درCPU بعید بنظر میرسد.  از انجا کهزمان بندى و مدیریت رشته ای  CPUدر نرم افزار انجام می شود، نمی تواند بسادگی به تعداد رشته هایی مقیاس بندی شود کهGPU مقیاس بندی میشود.از انجا که ما صرفا به ایجاد یک رشته برای هر عنصر اطلاعاتی دست میزنیم که قصد پردازش انرا داریم، برنامه نویسی موازی درGPU  می تواند به مراتب ساده تر از برنامه نویسی موازی درCPU باشد.

 پس از اعلام متغیرهای نگه دارنده ابعاد راه اندازی، کرنل مقادیر پیکسلی را به سادگی محاسبه میکند.

کرنل به دو قطعه از اطلاعاتی که ما به عنوان پارامتر میپذیریم، نیاز دارد.در ابتدا، به یک اشاره گر به حافظه دستگاهی دارای پیکسل های خروجی نیاز است.این یک متغیر جهانی است که حافظه خود را به Main ()  اختصاص داده است.اما متغیر تنها برای کد میزبان "جهانی" است، بنابراین ما باید انرا به عنوان پارامتری جهت اطمینان از اینکه زمان اجرایCUDA انرا برای کد دستگاهی قابل دسترس میسازد مورد تایید قرار دهیم.

در مرحله بعد، هسته ما نیاز به دانستن زمان جاری انیمیشن دارد پس می تواند فریم درستی را تولید کند.زمان جاری یا همان تیکها از کد زیرساختاری موجود در CPUAnimBitmapبه تابعgenerate_frame ()  انتقال میابند و بنابراین میتوانیم براحتی انرا به کرنل نیز انتقال دهیم.

 حالا نوبت به خود کد کرنل میرسد:

.

 در این خطوط هر رشته به شاخص خود در بلوک و شاخص بلوک خود در شبکه دست میابد و انها را به یک شاخص منحصر به فرد(x,y) درتصویر ترجمهمیکند. بنابراین، هنگامی که رشته در نمایه (3،  5) بلوک (12،8) شروع به اجرا میکند، می داند که 12 بلوک کامل در سمت چپ و 8 بلوک کامل دیگر در بالایش وجود دارند.در داخل این بلوک، رشته (3، 5) از سه رشته در سمت چپ و پنج رشته در بالای خود برخوردار است.از انجا که در هر بلوک 16 رشته وجود دارد، این معنا تداعی میشود که رشته مورد سوال از موارد زیر برخوردار میباشد:

3رشته+  12 بلوک×   رشته/بلوک=16   195رشته در سمت چپ ان

5  رشته8 +   بلوک×  رشته/بلوک=16  128در بالای ان  رشته

این محاسبه با محاسبهx وy در دو خط اول یکسان است و نحوه ای را که شاخص های رشته و بلوک به مختصات تصویر ترسیم میشوند را به ما نشان میدهد.  سپس ما بمنظور انتقال یک افست به بافر خروجی براحتی مقادیرx وy را بصورت طولی درمی اوریم که باز هم مشابه انچیزی است که ما در بخشهای " مجموعیک بردار بلند ترGPU  " و "مجموعبردارهای بطور دلخواهانه‏بلندGPU" انجام دادیم.

ما میدانیم که رشته باید کدام پیکسل(x,y) در تصویر را مورد محاسبه قرار دهد. همچنین ما زمانی را که به محاسبه این مقدار نیاز است را میدانیم و می توانیم هر تابع(x,y,t)  را محاسبه و این مقدار را در بافر خروجی ذخیرهکنیم. در این حالت، تابع یک " موج " سینوسی با زمانهای مختلف را تولید می کند.

 ما توصیه می کنیم که شما بیش از حد به این محاسبات نچندان دقیق دل نبندید. این در اصل فقط یک تابع دو بعدیزمان است که باعث بوجود امدن یک اثر موجدار خوب در هنگام انیمیشن سازی میشود.تصویر یک فریم باید چیزی شبیه بشکل 5ـ3 باشد.

شکل 7ـ3 ثصویری از یک مثال موجGPU

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