جزئيات پيادهسازي پردازندهجرياني
موازيسازي دادهها، يك دستورالعمل، چندين داده :
SIMD يا اجراي همزمان يك دستورالعمل بر روي چندين داده ، يكي از مفاهيم اساسي پيادهسازي پردازندههاي گرافيكي به شمار ميرود: در رندر كردن يك تصوير سه بعدي، برنامههاي سايهزن واحدي در هر سيكل كلاك بر روي چندين راس، Primitive يا پيكسل اجرا ميشوند. در سختافزاري كه قابليت SIMD دارد ، چندين واحد كوچك پردازشي (مانند SP) در كنار هم قرار گرفته و يك دستورالعمل را در هر سيكل كلاك پذيرفته و بر روي چندين داده آنرا اعمال ميكنند.
پياده سازي سختافزار پردازش موازي به اين سبك موجب ميشود كه از پيچيدگي غير ضروري واحدهاي كوچك پردازشي كاسته شود چرا كه ديگر ملزم به مديريت كردن دستورالعملها علاوه بر جريان داده در حين اجرا نخواهند بود. پردازندهگرافيكي نيز به عنوان سختافزاري كه وظيفه دارد به صورت Real-Time ميليون پيكسل با محاسبات پيچيده راسي، هندسي و پيكسلي ايجاد كرده و براي نمايش آماده سازد، يك پردازنده موازي SIMD بسيار قدرتمند به شمار ميرود، چرا كه اگر قرار بود مانند CPU بدون موازيسازي به محاسبه تك تك و پشت سر هم ميليونها پيكسل هر فريم بپردازد، نرخ فريم در ثانيه آنقدر كم ميشد كه ديگر نميتوان به آن Real-Time گفت. ضمن اينكه ذات عملياتهاي گرافيكي نيز SIMD است به اين معني كه معمولا يك نوع عمليات سايهزني بر روي بخشهاي بزرگي از پيكسلهاي يك فريم اجرا ميشود.
موازيسازي عملياتها : يك دستورالعمل، چندين عمليات:
زماني كه صحبت از دستورالعمل (Instruction) پردازنده ميشود، ما به يك عمليات محاسباتي (Operation) مانند جمع يا ضرب كه فكر ميكنيم در حالي كه يك دستورالعمل ميتواند چندين عمليات را به همراه داشته باشد و ممكن است جهت پردازش آن دستورالعمل، نياز به اجراي چندين عمليات بر روي دادهها باشد، به اين نوع دستورالعملها، VLIW گفته ميشود كه سختافزار با پذيرفتن آنها، چندين عمليات بر روي دادهها را تفسير ميكند. در سادهترين مثال دستورالعمل ADD يك دستورالعمل ساده به شمار ميرود كه عمليات جمع دو عدد را توصيف ميكند اما دستورالعمل MAD يك دستورالعمل VLIW است كه به كمك چندين عمليات جمع، حاصل ضرب دو عدد را محاسبه ميكند.
بهرهگيري از دستورالعملهاي VLIW راهكار مناسبي براي پيادهسازي سختافزاري است كه قابليت اجراي چندين عمليات با همديگر را داشته باشد اما فرض كنيد كه ما پنج واحد پردازشي در اختيار داشته باشيم كه به صورت موازي قرار است با يكديگر كار كنند، جهت بهره برداري از اين سختافزار لازم است كه هر يك از اين 5 واحد، عملياتي مستقل از عمليات واحد ديگر در هر سيكل كلاك انجام دهد تا نتيجه بدست آمده از واحد اول توسط واحد ديگر دستكاري نشود، به همين خاطر تعيين وابستگي دادهها در زمان اجرا و مشخص كردن دادهها و عملياتهاي مستقل از يكديگر جزو ملزومات اساسي اين سختافزار ميباشد.
مشخص كردن عملياتهاي مستقل از هم در زمان اجرا كار بسيار سختي است كه VLIW به ما امكان ميدهد كه عملياتهايي كه از هم مستقل هستند را از پيش شناسايي و در قابل يك دستورالعمل VLIW با يكديگر تركيب كنيم، سپس ميتوانيم بدون داشتن هيچ دقدقهاي، دستورالعمل جديد را به صورت يك دستور العمل سطح بالا به كامپايلر سختافزار معرفي كنيم تا كامپايلر با مشاهده آن دستورالعمل VLIW عملياتهاي مستقل مترادف آن را به سختافزار ارجاع دهد.
VLIW روش مناسبي جهت اعمال موازيسازي دستورالعملها بدون نياز به افزودن بر پيچيدگيهاي سختافزار ميباشد اما ميتواند به دردسر بزرگي براي طراحان كامپايلر تبديل شود چرا كه وابستگي ميان دستورالعملها را اينك آنها بايد تشخصي داده و راهكارهاي معادل جايگزينش كنند.
بازگشت مجدد به R600
اگر به خاطر داشته باشيد گفتيم مقايسه R600 با G80 كمي پيچيده تر از اين است كه با يك مقايسه ساده در مورد تعداد SPها يا Threadهايي كه در هر سيكل پردازش ميكنند، قضاوت كرد. به همين خاطر كمي بيشتر وارد جزئيات پياده سازي SP ها شديم تا بتوانيم اين مقايسه را با ديد و دانش مناسب انجام دهيم.
AMD در هسته R600 چهار آرايه SIMD از Spها قرار داده كه هر آرايه با عرض 5 واحد ميتواند دستورالعملهاي VLIW را پردازش كند اين دستورالعملها در هر آرايه به طور همزمان در 16 عدد Thread از راسها، Primitiveها يا پيكسلها ميتوانند پردازش شوند.
در برنامههاي سايهزن پيكسل، AMD بلاكهاي 8×8 از پيكسلهاي خام را به واحدهاي SIMD ارسال ميكند تا در چندين كلاك پردازش شوند كه ارتباط مراحل پردازشي در كلاكهاي مختلف توسط واحد انشعاب هر بلاك صورت ميگيرد.
بازگشت مجدد به G80
NVIDIA در رابطه با معماري پردازندهگرافيكي جديد خود بسيار بسته عمل كرده است و جزئيات بسيار محدودي در رابطه با آن ارائه كرده است، به همين خاطر تنها بر اساس تصاوير و اطلاعات اندك منتشر شده ميتوان در رابطه با معماري آن نظر داد.
هسته G80 از 8 واحد SIMD ساخته شده كه هريك داراي 16 عدد SP ميباشد، دستورالعملهاي SIMD ديگر از نوع VLIW نيستند بلكه دستورالعملهاي سادهاي است كه هر SP آن را در Thread هاي مختلفي ميتواند اجرا كند. مسلما NVIDIA نيز با مشكل وابستگي دادهها در پردازنده موازي خود دست و پنجه نرم كرده است اما با وجود اينكه گروههاي 16 تايي از SP ها كه يك واحد SIMD را تشكيل ميدهند از منابع اشتراكي استفاده ميكنند، كامپايلر NVIDIA نيازي به ساختن دستورالعملهاي VLIW جهت زمانبندي SPها و حفظ استقلال عملكردهاي آنها را ندارد، چرا كه اين وابستگي به دليل اجراي عملياتهاي مشابه در Threadهاي مختلف (يا عملياتهاي غيرمشابه در Thread هاي يكسان) به ندرت پيش ميآيد.
در نتيجه به اعمال اين محدوديت همانطور كه اشاره شد، حداكثر هشت عمليات سايهزني مختلف در آن واحد توسط 128 عدد SP داخل G80 قابل اجرا ميباشد.
در اين پردازنده گرافيكي Threadهاي راسي در بلاكهاي 4×4 به واحدهاي SIMD داده ميشود در حالي كه Threadهاي هندسي و پيكسلي در بلاكهاي 32 تايي پردازش ميشوند (دو بلاك 16 تايي در دو سيكل كلاك) .
در اين نوع پياده سازي لازم نيست ديگر نگران وابستگي دادهها در كد برنامه سايهزن باشيم، البته در اين حالت نميتوانيم به طور مستقيم راهكارهاي موازيسازي را از كدبرنامه سايهزن استخراج كنيم.