محاسبات روشن است پردازنده های گرافیکی

فناوری CUDA (معماری یکپارچه دستگاه محاسبه) یک معماری نرم‌افزاری و سخت‌افزاری است که امکان محاسبات با استفاده از پردازنده‌های گرافیکی NVIDIA را فراهم می‌کند که از فناوری GPGPU (محاسبات خودسرانه روی کارت‌های ویدیویی) پشتیبانی می‌کنند. معماری CUDA اولین بار با عرضه تراشه نسل هشتم NVIDIA - G80 در بازار ظاهر شد و در تمام سری های بعدی تراشه های گرافیکی که در خانواده شتاب دهنده های GeForce، ION، Quadro و Tesla استفاده می شوند، وجود دارد.

CUDA SDK به برنامه‌نویسان اجازه می‌دهد تا الگوریتم‌هایی را که می‌توانند بر روی پردازنده‌های گرافیکی NVIDIA اجرا شوند و شامل توابع ویژه در متن برنامه C هستند، به گویش ساده‌شده خاص زبان برنامه‌نویسی C پیاده‌سازی کنند. CUDA به توسعه دهنده این فرصت را می دهد تا به صلاحدید خود دسترسی به مجموعه دستورالعمل های شتاب دهنده گرافیکی را سازماندهی کند و حافظه آن را مدیریت کند، محاسبات موازی پیچیده را بر روی آن سازماندهی کند.

داستان

در سال 2003، اینتل و AMD بیشترین رقابت را داشتند پردازنده قدرتمند. در طول سال ها، سرعت ساعت به طور قابل توجهی در نتیجه این مسابقه افزایش یافته است، به خصوص پس از عرضه Intel Pentium 4.

پس از افزایش فرکانس های ساعت (بین سال های 2001 تا 2003، فرکانس ساعت پنتیوم 4 از 1.5 به 3 گیگاهرتز دو برابر شد) و کاربران مجبور بودند به دهم گیگاهرتز که سازندگان به بازار آوردند (از سال 2003 تا 2005، ساعت) راضی باشند. فرکانس ها 3 به 3.8 گیگاهرتز افزایش یافت).

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

دلیل اینکه سازندگان GPU با این مشکل مواجه نشده‌اند بسیار ساده است: CPUها به گونه‌ای طراحی شده‌اند که بهترین عملکرد را در جریانی از دستورالعمل‌ها داشته باشند که داده‌های مختلف را پردازش می‌کنند (اعم از اعداد صحیح و اعداد شناور)، دسترسی تصادفی به حافظه و غیره را انجام می‌دهند. تا به حال، توسعه‌دهندگان تلاش کرده‌اند تا موازی‌سازی دستورالعمل‌ها را بیشتر کنند - یعنی تا آنجا که ممکن است دستورالعمل‌ها را به صورت موازی اجرا کنند. بنابراین، برای مثال، اجرای superscalar با Pentium ظاهر شد، زمانی که تحت شرایط خاصی امکان اجرای دو دستورالعمل در هر ساعت وجود داشت. پنتیوم پرو دستورات غیرقابل سفارشی را دریافت کرد که امکان بهینه سازی عملکرد واحدهای محاسباتی را فراهم کرد. مشکل این است که اجرای موازی یک جریان متوالی دستورالعمل ها دارای محدودیت های آشکاری است، بنابراین افزایش کورکورانه تعداد واحدهای محاسباتی سودی به همراه ندارد، زیرا در بیشتر مواقع آنها همچنان بیکار خواهند بود.

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

GPU نه تنها در این مورد با CPU متفاوت است. دسترسی به حافظه در GPU بسیار همراه است - اگر یک تکل خوانده شود، پس از چند چرخه، تکسل مجاور خوانده می شود. وقتی یک پیکسل نوشته می شود، پیکسل همسایه بعد از چند چرخه نوشته می شود. با سازماندهی هوشمند حافظه، می توانید عملکردی نزدیک به پهنای باند نظری داشته باشید. این بدان معنی است که پردازنده گرافیکی، بر خلاف CPU، به حافظه پنهان بزرگ نیاز ندارد، زیرا نقش آن سرعت بخشیدن به عملیات بافت است. تنها چیزی که لازم است چند کیلوبایت حاوی چند تکل است که در فیلترهای دو خطی و سه خطی استفاده می شود.

اولین محاسبات روی پردازنده گرافیکی

اولین تلاش ها برای چنین برنامه ای محدود به استفاده از برخی ویژگی های سخت افزاری مانند شطرنجی سازی و Z-buffering بود. اما در قرن حاضر، با ظهور شیدرها، آنها شروع به سرعت بخشیدن به محاسبه ماتریس ها کردند. در سال 2003، بخش جداگانه ای برای محاسبات GPU به SIGGRAPH اختصاص یافت و GPGPU (محاسبات با هدف عمومی در GPU) نام گرفت.

شناخته شده ترین BrookGPU کامپایلر زبان برنامه نویسی Brook stream است که برای انجام محاسبات غیر گرافیکی بر روی GPU طراحی شده است. قبل از ظهور، توسعه دهندگانی که از قابلیت های تراشه های ویدئویی برای محاسبات استفاده می کردند، یکی از دو API رایج را انتخاب می کردند: Direct3D یا OpenGL. این به طور جدی استفاده از GPU را محدود کرد، زیرا گرافیک های سه بعدی از سایه بان ها و بافت هایی استفاده می کنند که برنامه نویسان موازی نیازی به دانستن در مورد آنها ندارند، آنها از رشته ها و هسته ها استفاده می کنند. بروک توانست به آسان‌تر کردن کار آنها کمک کند. این پسوندهای پخش جریانی به زبان C، که در دانشگاه استنفورد توسعه یافتند، API 3D را از برنامه نویسان مخفی کردند و تراشه ویدیویی را به عنوان یک پردازشگر موازی ارائه کردند. کامپایلر یک فایل .br را با کد و پسوندهای C++ تجزیه کرد و کدی را تولید کرد که به یک کتابخانه دارای DirectX، OpenGL یا x86 متصل است.

ظهور Brook علاقه NVIDIA و ATI را برانگیخت و بخش جدیدی از آن را باز کرد - رایانه های موازی مبتنی بر تراشه های ویدیویی.

علاوه بر این، برخی از محققان پروژه بروک به تیم توسعه NVIDIA رفتند تا یک استراتژی محاسباتی موازی سخت‌افزار-نرم‌افزار را معرفی کنند و سهم جدیدی از بازار را باز کنند. و مزیت اصلی این ابتکار NVIDIA این بود که توسعه دهندگان تمام قابلیت های GPU خود را تا ریزترین جزئیات کاملاً می دانند و نیازی به استفاده از API گرافیکی نیست و می توانید مستقیماً با استفاده از درایور با سخت افزار کار کنید. حاصل تلاش این تیم NVIDIA CUDA است.

زمینه های کاربرد محاسبات موازی در GPU

هنگامی که محاسبات به GPU منتقل می شود، در بسیاری از کارها شتاب 5-30 برابر در مقایسه با پردازنده های همه منظوره سریع به دست می آید. بیشترین اعداد (از مرتبه افزایش سرعت 100 برابر و حتی بیشتر!) روی کدهایی به دست می‌آیند که برای محاسبات با استفاده از بلوک‌های SSE چندان مناسب نیستند، اما برای GPU کاملاً مناسب هستند.

اینها فقط چند نمونه از افزایش سرعت کد مصنوعی در GPU در مقابل کد SSE بردار روی CPU هستند (طبق گفته NVIDIA):

میکروسکوپ فلورسانس: 12x.

دینامیک مولکولی (کالک نیروی غیر پیوندی): 8-16x.

الکترواستاتیک (جمع کولن مستقیم و چند سطحی): 40-120x و 7x.

جدولی که انویدیا در تمام ارائه ها نشان می دهد که سرعت GPU ها را نسبت به CPU نشان می دهد.

فهرست کاربردهای عمده ای که محاسبات GPU در آنها استفاده می شود: تجزیه و تحلیل و پردازش تصویر و سیگنال، شبیه سازی فیزیک، ریاضیات محاسباتی، زیست شناسی محاسباتی، محاسبات مالی، پایگاه های داده، دینامیک گاز و مایعات، رمزنگاری، پرتودرمانی تطبیقی، نجوم، پردازش صدا، بیوانفورماتیک، شبیه سازی های بیولوژیکی، بینایی کامپیوتری، داده کاوی، سینما و تلویزیون دیجیتال، شبیه سازی الکترومغناطیسی، سیستم های اطلاعات جغرافیایی، کاربردهای نظامی، برنامه ریزی معدن، دینامیک مولکولی، تصویربرداری تشدید مغناطیسی (MRI)، شبکه های عصبی، تحقیقات اقیانوس شناسی، فیزیک ذرات، شبیه سازی تاشو پروتئین، شیمی کوانتومی، ردیابی پرتو، تصویربرداری، رادار، شبیه سازی مخزن، هوش مصنوعی، تجزیه و تحلیل داده های ماهواره ای، اکتشاف لرزه ای، جراحی، سونوگرافی، ویدئو کنفرانس.

مزایا و محدودیت های CUDA

از دیدگاه یک برنامه نویس، خط لوله گرافیکی مجموعه ای از مراحل پردازش است. بلوک هندسی مثلث ها را تولید می کند و بلوک شطرنجی پیکسل های نمایش داده شده روی مانیتور را تولید می کند. مدل سنتی برنامه نویسی GPGPU به شرح زیر است:

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

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

معماری سخت‌افزار و نرم‌افزار NVIDIA برای محاسبات بر روی پردازنده‌های گرافیکی از NVIDIA با مدل‌های قبلی GPGPU متفاوت است، زیرا امکان نوشتن برنامه‌های GPU را به زبان C واقعی با نحو استاندارد، اشاره‌گرها و نیاز به حداقل پسوندها برای دسترسی به منابع محاسباتی تراشه‌های ویدئویی فراهم می‌کند. CUDA به API های گرافیکی وابسته نیست و دارای برخی ویژگی ها است که به طور خاص برای محاسبات با هدف عمومی طراحی شده اند.

مزایای CUDA نسبت به رویکرد سنتی برای محاسبات GPGPU

CUDA دسترسی به 16 کیلوبایت حافظه مشترک در هر چند پردازنده را فراهم می کند، که می تواند برای سازماندهی کش با پهنای باند بالاتر از واکشی بافت استفاده شود.

انتقال کارآمدتر داده بین سیستم و حافظه ویدئویی؛

بدون نیاز به APIهای گرافیکی با افزونگی و سربار.

آدرس دهی خطی حافظه، جمع آوری و پراکندگی، توانایی نوشتن در آدرس های دلخواه.

پشتیبانی سخت افزاری برای عملیات اعداد صحیح و بیتی.

محدودیت های اصلی CUDA:

عدم پشتیبانی بازگشتی برای توابع اجرایی؛

حداقل عرض بلوک 32 رشته است.

معماری بسته CUDA متعلق به NVIDIA.

نقاط ضعف برنامه‌نویسی با روش‌های قبلی GPGPU این است که این روش‌ها از واحدهای اجرای سایه‌زن راس در معماری‌های غیر یکپارچه قبلی استفاده نمی‌کنند، داده‌ها در بافت‌ها و خروجی‌ها در بافر خارج از صفحه ذخیره می‌شوند و الگوریتم‌های چند پاس از واحدهای سایه‌زن پیکسل استفاده می‌کنند. محدودیت‌های GPGPU عبارتند از: استفاده ناکافی از قابلیت‌های سخت‌افزار، محدودیت‌های پهنای باند حافظه، عدم عملیات پراکندگی (فقط جمع‌آوری)، استفاده اجباری از API گرافیکی.

مزیت های اصلی CUDA نسبت به روش های قبلی GPGPU از این واقعیت ناشی می شود که این معماری به این صورت طراحی شده است استفاده موثرمحاسبات غیر گرافیکی روی GPU و با استفاده از زبان برنامه نویسی C، بدون نیاز به انتقال الگوریتم ها به شکلی مناسب برای مفهوم خط لوله گرافیکی. CUDA ارائه می دهد مسیر جدیدمحاسبات GPU که از APIهای گرافیکی استفاده نمی کند و دسترسی تصادفی به حافظه (پراکنده یا جمع آوری) ارائه می دهد. چنین معماری عاری از معایب GPGPU است و از تمام واحدهای اجرایی استفاده می کند و همچنین قابلیت ها را از طریق ریاضیات اعداد صحیح و عملیات bit shift گسترش می دهد.

CUDA برخی از ویژگی‌های سخت‌افزاری را که از APIهای گرافیکی در دسترس نیستند، مانند حافظه مشترک باز می‌کند. این مقدار کمی از حافظه (16 کیلوبایت در هر چند پردازنده) است که بلوک های رشته ها به آن دسترسی دارند. این به شما امکان می دهد تا داده هایی را که اغلب به آنها دسترسی دارید ذخیره کنید و می تواند اطلاعات بیشتری را ارائه دهد سرعت بالا، در مقایسه با استفاده از واکشی بافت برای این کار. این، به نوبه خود، حساسیت توان عملیاتی الگوریتم های موازی را در بسیاری از برنامه ها کاهش می دهد. به عنوان مثال، برای جبر خطی، تبدیل فوریه سریع و فیلترهای پردازش تصویر مفید است.

در CUDA و دسترسی به حافظه راحت تر است. کد برنامهدر API گرافیکی، داده ها را در قالب 32 مقدار نقطه شناور تک دقیق (مقادیر RGBA به طور همزمان در هشت هدف رندر) در مناطق از پیش تعریف شده خروجی می دهد و CUDA از ضبط پراکنده پشتیبانی می کند - تعداد نامحدودی رکورد در هر آدرس. . چنین مزایایی امکان اجرای برخی از الگوریتم‌ها را بر روی GPU فراهم می‌کند که با استفاده از روش‌های GPGPU مبتنی بر API گرافیکی نمی‌توان آنها را به طور موثر پیاده‌سازی کرد.

همچنین، API های گرافیکی لزوماً داده ها را در بافت ها ذخیره می کنند، که نیاز به بسته بندی قبلی آرایه های بزرگ در بافت ها دارد، که الگوریتم را پیچیده می کند و استفاده از آدرس دهی ویژه را مجبور می کند. و CUDA به شما امکان می دهد داده ها را در هر آدرسی بخوانید. یکی دیگر از مزایای CUDA ارتباط بهینه بین CPU و GPU است. و برای توسعه دهندگانی که می خواهند به سطح پایین (مثلاً هنگام نوشتن یک زبان برنامه نویسی دیگر) دسترسی داشته باشند، CUDA امکان برنامه نویسی به زبان اسمبلی سطح پایین را ارائه می دهد.

معایب CUDA

یکی از معدود معایب CUDA قابلیت حمل ضعیف آن است. این معماری فقط روی تراشه‌های ویدیویی این شرکت کار می‌کند و نه روی همه آن‌ها، بلکه از سری‌های GeForce 8 و 9 و Quadro، ION و Tesla مربوطه شروع می‌شود. انویدیا 90 میلیون تراشه ویدئویی سازگار با CUDA را ارائه می دهد.

جایگزین های CUDA

چارچوبی برای نوشتن برنامه های کامپیوتریمرتبط با محاسبات موازی بر روی پردازنده های گرافیکی و مرکزی مختلف. چارچوب OpenCL شامل یک زبان برنامه نویسی مبتنی بر استاندارد C99 و یک رابط برنامه نویسی کاربردی (API) است. OpenCL موازی سازی در سطح دستورالعمل و سطح داده را ارائه می دهد و پیاده سازی تکنیک GPGPU است. OpenCL یک استاندارد کاملا باز است و هیچ هزینه مجوزی برای استفاده از آن وجود ندارد.

هدف OpenCL تکمیل OpenGL و OpenAL است که استانداردهای صنعت باز برای گرافیک و صداهای سه بعدی کامپیوتری هستند، با بهره گیری از قدرت GPU. OpenCL توسط گروه Khronos، یک کنسرسیوم غیرانتفاعی که شامل بسیاری از شرکت‌های بزرگ از جمله Apple، AMD، Intel، nVidia، Sun Microsystems، Sony Computer Entertainment و دیگران است، توسعه و نگهداری می‌شود.

CAL/IL (لایه انتزاعی محاسبه/زبان متوسط)

ATI Stream Technology مجموعه ای از سخت افزار و فناوری های نرم افزاری، که به شما امکان می دهد از پردازنده های گرافیکی AMD در ارتباط با CPU برای سرعت بخشیدن به بسیاری از برنامه ها (نه فقط برنامه های گرافیکی) استفاده کنید.

حوزه های کاربردی ATI Stream برنامه هایی هستند که برای منابع محاسباتی نیاز دارند، مانند تجزیه و تحلیل مالییا پردازش داده های لرزه ای. استفاده از یک پردازنده جریانی باعث شد تا سرعت برخی از محاسبات مالی تا 55 برابر در مقایسه با حل یک مشکل مشابه افزایش یابد. CPU.

انویدیا فناوری ATI Stream را رقیب بسیار قدرتمندی نمی داند. CUDA و Stream دو فناوری متفاوت هستند که در سطوح مختلف توسعه قرار دارند. برنامه نویسی برای محصولات ATI بسیار دشوارتر است - زبان آنها بیشتر شبیه یک اسمبلر است. از طرف دیگر، CUDA C یک زبان سطح بسیار بالاتر است. نوشتن روی آن راحت تر و راحت تر است. برای شرکت های توسعه بزرگ، این بسیار مهم است. اگر در مورد عملکرد صحبت کنیم، می بینیم که اوج ارزش آن در محصولات ATI بیشتر از راه حل های NVIDIA است. اما باز هم همه چیز به نحوه بدست آوردن این قدرت بستگی دارد.

DirectX11 (DirectCompute)

یک رابط برنامه‌نویسی کاربردی که بخشی از DirectX است، مجموعه‌ای از APIهای مایکروسافت که برای اجرا بر روی رایانه‌های سازگار با IBM PC طراحی شده است. سیستم های عاملخانواده ویندوز مایکروسافت DirectCompute برای انجام محاسبات با هدف کلی بر روی GPU ها طراحی شده است که اجرای مفهوم GPGPU است. DirectCompute در ابتدا به عنوان بخشی از DirectX 11 منتشر شد، اما بعداً برای DirectX 10 و DirectX 10.1 نیز در دسترس قرار گرفت.

NVDIA CUDA در محیط علمی روسیه.

از دسامبر 2009، مدل برنامه نویسی CUDA در 269 دانشگاه در سراسر جهان تدریس می شود. در روسیه، دوره‌های آموزشی CUDA در دانشگاه‌های دولتی مسکو، سن پترزبورگ، کازان، نووسیبیرسک و پرم، دانشگاه بین‌المللی طبیعت جامعه و انسان «دوبنا»، مؤسسه مشترک تحقیقات هسته‌ای، مؤسسه الکترونیک مسکو تدریس می‌شود. فناوری، دانشگاه مهندسی برق دولتی ایوانوو، BSTU. V. G. Shukhova، MSTU im. باومن، RKhTU im. مندلیف، مرکز تحقیقات روسیه "موسسه کورچاتوف"، مرکز بین منطقه ای ابر رایانه آکادمی علوم روسیه، موسسه فناوری تاگانروگ (TTI SFedU).

ویژگی های معماری Radeon AMD/ATI

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

ما تشابهات بیشتری را ترسیم می کنیم - پس از یک تکامل طولانی در خشکی، پستانداران به دریا نفوذ کردند، جایی که ساکنان معمولی دریایی را بیرون راندند. در مبارزه رقابتی، پستانداران هم از توانایی‌های پیشرفته جدیدی که در سطح زمین ظاهر می‌شوند و هم از توانایی‌هایی که به‌ویژه برای سازگاری با زندگی در آب به دست آورده بودند، استفاده کردند. به همین ترتیب، پردازنده‌های گرافیکی، بر اساس مزیت‌های معماری برای گرافیک‌های سه بعدی، به طور فزاینده‌ای در حال به دست آوردن قابلیت‌های ویژه مفید برای کارهای غیر گرافیکی هستند.

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

پردازنده گرافیکی متشکل از چندین هسته پردازشی (30 برای Nvidia GT200، 20 برای Evergreen، 16 برای Fermi) است که در اصطلاح انویدیا Streaming Multiprocessor و در اصطلاح ATI SIMD Engine نامیده می شود. در چارچوب این مقاله، ما آنها را مینی پردازنده می نامیم، زیرا آنها چندین صد رشته برنامه را اجرا می کنند و تقریباً می توانند هر کاری را که یک CPU معمولی می تواند انجام دهد، اما هنوز همه چیز را انجام نمی دهد.

نام های بازاریابی گیج کننده هستند - آنها، برای اهمیت بیشتر، تعداد ماژول های کاربردی را نشان می دهند که می توانند تفریق و ضرب شوند: به عنوان مثال، 320 بردار "هسته" (هسته). این هسته ها بیشتر شبیه غلات هستند. بهتر است GPU را به عنوان یک پردازنده چند هسته ای با تعداد زیادی هسته که رشته های زیادی را به طور همزمان اجرا می کنند در نظر بگیرید.

هر مینی پردازنده دارای حافظه محلی است، 16 کیلوبایت برای GT200، 32 کیلوبایت برای Evergreen، و 64 کیلوبایت برای Fermi (در اصل یک حافظه نهان L1 قابل برنامه ریزی). زمان دسترسی مشابهی به حافظه نهان L1 یک CPU معمولی دارد و عملکردهای مشابهی را برای تحویل داده ها به ماژول های تابع در سریع ترین زمان ممکن انجام می دهد. در معماری فرمی، بخشی از حافظه محلی را می توان به عنوان یک کش معمولی پیکربندی کرد. در GPU از حافظه محلی برای تبادل سریع داده ها بین رشته های در حال اجرا استفاده می شود. یکی از طرح های معمول برای یک برنامه GPU به شرح زیر است: ابتدا داده های حافظه جهانی GPU در حافظه محلی بارگذاری می شود. این فقط حافظه ویدیویی معمولی است که قرار دارد (مانند حافظه سیستم) به طور جداگانه از پردازنده "خود" - در مورد ویدئو، توسط چندین ریز مدار بر روی textolite کارت ویدئو لحیم می شود. سپس چند صد رشته با این داده ها در حافظه محلی کار می کنند و نتیجه را در حافظه جهانی می نویسند و پس از آن به CPU منتقل می شود. این وظیفه برنامه نویس است که دستورالعمل های بارگیری و تخلیه داده ها را از حافظه محلی بنویسد. در اصل، این پارتیشن بندی داده ها [یک کار خاص] برای پردازش موازی است. GPU همچنین از دستورالعمل‌های نوشتن/خواندن اتمی در حافظه پشتیبانی می‌کند، اما آنها ناکارآمد هستند و معمولاً در مرحله نهایی برای "چسباندن" نتایج محاسبات همه ریزپردازنده‌ها مورد نیاز هستند.

حافظه محلی برای همه رشته هایی که در مینی پردازنده در حال اجرا هستند مشترک است، بنابراین، به عنوان مثال، در اصطلاحات انویدیا حتی به آن اشتراک گذاری شده می گویند، و اصطلاح حافظه محلی دقیقاً به معنای برعکس است، یعنی: یک منطقه شخصی خاص از یک رشته جداگانه در سراسری. حافظه، فقط برای آن قابل مشاهده و در دسترس است. اما علاوه بر حافظه محلی، مینی پردازنده دارای حافظه دیگری است که در تمام معماری ها حدود چهار برابر حجم بیشتری دارد. به طور مساوی بین تمام رشته‌های اجراکننده تقسیم می‌شود؛ اینها ثبات‌هایی برای ذخیره متغیرها و نتایج میانی محاسبات هستند. هر رشته دارای چندین ده ثبت است. تعداد دقیق بستگی به این دارد که مینی پردازنده چند رشته در حال اجرا است. این عدد بسیار مهم است، زیرا تأخیر حافظه جهانی بسیار زیاد است، صدها چرخه، و در غیاب حافظه پنهان، جایی برای ذخیره نتایج میانی محاسبات وجود ندارد.

و یک ویژگی مهم دیگر GPU: برداری "نرم". هر مینی پردازنده دارای تعداد زیادی ماژول محاسباتی است (8 عدد برای GT200، 16 عدد برای Radeon و 32 عدد برای Fermi)، اما آنها فقط می توانند همان دستورات را با همان آدرس برنامه اجرا کنند. عملوندها در این مورد می توانند متفاوت باشند، رشته های مختلف خود را دارند. به عنوان مثال، دستورالعمل محتویات دو رجیستر را اضافه کنید: به طور همزمان توسط همه دستگاه های محاسباتی اجرا می شود، اما ثبات های مختلفی گرفته می شود. فرض بر این است که تمام رشته‌های برنامه GPU که پردازش موازی داده‌ها را انجام می‌دهند، عموماً در یک مسیر موازی از طریق کد برنامه حرکت می‌کنند. بنابراین، تمام ماژول های محاسباتی به طور یکنواخت بارگذاری می شوند. و اگر thread ها به دلیل انشعابات در برنامه در مسیر اجرای کد خود از هم جدا شده باشند، به اصطلاح سریال سازی اتفاق می افتد. سپس از همه ماژول‌های محاسباتی استفاده نمی‌شود، زیرا رشته‌ها دستورالعمل‌های مختلفی را برای اجرا ارسال می‌کنند و بلوک ماژول‌های محاسباتی می‌تواند، همانطور که قبلاً گفتیم، فقط یک دستورالعمل را با یک آدرس اجرا کند. و البته عملکرد در همان زمان نسبت به حداکثر کاهش می یابد.

مزیت این است که برداری کاملا خودکار است، برنامه نویسی با استفاده از SSE، MMX و غیره نیست. و GPU خود اختلافات را کنترل می کند. از نظر تئوری، می توان بدون فکر کردن به ماهیت برداری ماژول های اجرا کننده، برنامه هایی را برای GPU نوشت، اما سرعت چنین برنامه ای خیلی زیاد نخواهد بود. نقطه ضعف عرض زیاد بردار است. از تعداد اسمی ماژول های کاربردی بیشتر است و برای پردازنده های گرافیکی Nvidia 32 و برای Radeon 64 است. نخ ها در بلوک هایی با اندازه مناسب پردازش می شوند. انویدیا این بلوک نخ ها را اصطلاح Warp، AMD - wave front می نامد که همان چیزی است. بنابراین، در 16 دستگاه محاسباتی، یک "جبهه موج" به طول 64 رشته در چهار چرخه (با فرض طول دستورالعمل معمول) پردازش می شود. نویسنده در این مورد اصطلاح Warp را به دلیل ارتباط با اصطلاح دریایی Warp ترجیح می دهد که به طناب بسته شده از طناب های پیچ خورده اشاره دارد. بنابراین نخ ها "پیچ می شوند" و یک بسته نرم افزاری تشکیل می دهند. با این حال، "جبهه موج" همچنین می تواند با دریا مرتبط باشد: دستورالعمل ها به همان روشی که امواج یکی پس از دیگری به ساحل می روند به محرک ها می رسد.

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

اگرچه هر مینی پردازنده (Streaming Multi Processor یا SIMD Engine) دستورات مربوط به تنها یک Warp (مجموعه ای از رشته ها) را در هر زمان معین اجرا می کند، اما دارای ده ها Warp فعال در مخزن اجرایی است. پس از اجرای دستورات یک Warp، مینی پردازنده نه دستورالعمل بعدی رشته های این Warp، بلکه دستورات شخص دیگری را در Warp اجرا می کند. این Warp می تواند در یک مکان کاملاً متفاوت در برنامه باشد، این روی سرعت تأثیری نخواهد داشت، زیرا فقط در داخل Warp باید دستورالعمل های همه Thread ها برای اجرای با سرعت کامل یکسان باشد.

در این مورد، هر یک از 20 موتور SIMD دارای چهار جبهه موج فعال است که هر کدام دارای 64 رشته است. هر رشته با یک خط کوتاه نشان داده می شود. مجموع: 64×4×20=5120 نخ

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

نکته اصلی این است که GPU پشته ای ندارد که بتوان پارامترهای تابع و متغیرهای محلی را در آن ذخیره کرد. با توجه به تعداد زیاد نخ ها برای پشته، به سادگی جایی روی تراشه وجود ندارد. در واقع، از آنجایی که GPU به طور همزمان حدود 10000 رشته را اجرا می کند، با اندازه یک پشته رشته تک رشته ای 100 کیلوبایت، مقدار کل 1 گیگابایت خواهد بود که برابر با مقدار استاندارد کل حافظه ویدیویی است. علاوه بر این، هیچ راهی برای قرار دادن یک پشته با هر اندازه قابل توجهی در خود هسته GPU وجود ندارد. به عنوان مثال، اگر 1000 بایت پشته در هر رشته قرار دهید، تنها یک مینی پردازنده به 1 مگابایت حافظه نیاز دارد که تقریباً پنج برابر کل حافظه محلی مینی پردازنده و حافظه اختصاص داده شده برای ذخیره سازی ثبات ها است.

بنابراین، هیچ بازگشتی در برنامه GPU وجود ندارد و شما واقعاً نمی‌توانید با فراخوانی تابع بچرخید. وقتی برنامه کامپایل می شود، همه توابع مستقیماً در کد جایگزین می شوند. این امر دامنه GPU را به وظایف محاسباتی محدود می کند. گاهی اوقات می توان از یک شبیه سازی پشته محدود با استفاده از حافظه جهانی برای الگوریتم های بازگشتی با عمق تکرار کوچک شناخته شده استفاده کرد، اما این یک برنامه GPU معمولی نیست. برای انجام این کار، لازم است به طور ویژه یک الگوریتم توسعه داده شود، تا امکان اجرای آن بدون تضمین شتاب موفق در مقایسه با CPU بررسی شود.

فرمی اولین بار قابلیت استفاده از توابع مجازی را معرفی کرد، اما باز هم استفاده از آنها به دلیل عدم وجود یک کش بزرگ و سریع برای هر رشته محدود شده است. 1536 رشته 48 کیلوبایت یا 16 کیلوبایت L1 را شامل می شود، یعنی توابع مجازی در برنامه را می توان نسبتاً به ندرت استفاده کرد، در غیر این صورت پشته از حافظه جهانی آهسته نیز استفاده می کند که باعث کاهش سرعت اجرا می شود و به احتمال زیاد در مقایسه با آن مزایایی به همراه نخواهد داشت. به نسخه CPU

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

مزایای معماری

اما GPU را بسیار سریع در نظر می گیرد. و در این امر چند نخی بالای خود به او کمک می کند. تعداد زیادی رشته فعال این امکان را فراهم می کند که تا حدودی تأخیر بزرگ حافظه ویدیویی جهانی را که به طور جداگانه واقع شده است پنهان کنید، که حدود 500 چرخه است. به ویژه برای کدهای با چگالی بالا سطح خوبی دارد. عملیات حسابی. بنابراین، یک سلسله مراتب کش L1-L2-L3 گران ترانزیستور مورد نیاز نیست. در عوض، بسیاری از ماژول‌های محاسباتی را می‌توان روی یک تراشه قرار داد و عملکرد محاسباتی فوق‌العاده‌ای را ارائه کرد. در همین حین، دستورالعمل های یک thread یا warp در حال اجرا هستند، صدها نخ دیگر بی سر و صدا منتظر داده های خود هستند.

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

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

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

مشکل پنهان کردن تأخیرها برای CPUهای مدرن با فرکانس بالا نیز حاد است؛ برای از بین بردن آن از روش های پیچیده ای استفاده می شود - خط لوله عمیق، اجرای دستورات خارج از دستور (غیر از نظم). این به زمان‌بندی‌های پیچیده اجرای دستورالعمل، بافرهای مختلف و غیره نیاز دارد که فضای روی تراشه را اشغال می‌کند. این همه برای بهترین عملکرد در حالت تک رشته ای لازم است.

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

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

مثال

یکی از کلاسیک ترین مشکلات GPU، مشکل محاسبه برهمکنش اجسام N است که یک میدان گرانشی ایجاد می کنند. اما اگر به عنوان مثال، ما نیاز به محاسبه تکامل سیستم زمین-ماه-خورشید داشته باشیم، GPU کمک کننده بدی برای ما است: اجسام کمی وجود دارد. برای هر شی، لازم است تعاملات با تمام اشیاء دیگر محاسبه شود و تنها دو مورد از آنها وجود دارد. در مورد حرکت منظومه شمسی با تمام سیارات و قمرهای آنها (حدود چند صد شی)، GPU هنوز کارآمد نیست. با این حال، یک پردازنده چند هسته ای، به دلیل هزینه های بالای سربار برای مدیریت thread، همچنین نمی تواند تمام قدرت خود را نشان دهد، در حالت تک رشته ای کار می کند. اما اگر شما همچنین نیاز به محاسبه مسیر دنباله‌دارها و اجرام کمربند سیارکی دارید، این کار از قبل برای GPU انجام می‌شود، زیرا اشیاء کافی برای ایجاد تعداد مورد نیاز رشته‌های محاسباتی موازی وجود دارد.

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

فرصت دیگری برای استفاده از قدرت پردازنده گرافیکی در مشکل N-body زمانی ظاهر می شود که شما نیاز به محاسبه بسیاری از مشکلات فردی، البته با تعداد اندک بدنه دارید. به عنوان مثال، اگر می خواهید تکامل یک سیستم را برای گزینه های مختلف برای سرعت های اولیه محاسبه کنید. سپس استفاده موثر از GPU بدون مشکل امکان پذیر خواهد بود.

جزئیات ریزمعماری AMD Radeon

ما اصول اولیه سازماندهی GPU را در نظر گرفته ایم، آنها برای شتاب دهنده های ویدئویی همه تولید کنندگان مشترک هستند، زیرا آنها در ابتدا یک وظیفه هدف داشتند - برنامه های سایه زن. با این حال، سازندگان ممکن است در مورد جزئیات اجرای ریزمعماری اختلاف نظر داشته باشند. اگرچه CPU های فروشندگان مختلف گاهی اوقات بسیار متفاوت هستند، حتی اگر سازگار باشند، مانند Pentium 4 و Athlon یا Core. معماری انویدیا در حال حاضر به طور گسترده شناخته شده است، اکنون به Radeon نگاه می کنیم و تفاوت های اصلی در رویکردهای این فروشندگان را برجسته می کنیم.

کارت‌های گرافیک AMD از زمان خانواده Evergreen که در مشخصات DirectX 11 نیز پیشگام بودند، پشتیبانی کامل را برای محاسبات عمومی دریافت کرده‌اند. کارت‌های خانواده 47xx دارای محدودیت‌های قابل توجهی هستند که در ادامه به آنها اشاره خواهد شد.

تفاوت در اندازه حافظه محلی (32 KB برای Radeon در مقابل 16 KB برای GT200 و 64 KB برای Fermi) معمولاً اساسی نیست. و همچنین اندازه جلو موج 64 رشته برای AMD در مقابل 32 رشته در هر تار برای Nvidia. تقریباً هر برنامه GPU را می توان به راحتی پیکربندی مجدد کرد و با این پارامترها تنظیم کرد. عملکرد می تواند ده ها درصد تغییر کند، اما در مورد یک GPU، این مهم نیست، زیرا یک برنامه GPU معمولاً ده برابر کندتر از همتای خود برای CPU اجرا می شود، یا ده برابر سریعتر، یا اصلاً کار نمی کند.

مهمتر استفاده است فناوری های AMD VLIW (کلمه دستورالعمل بسیار طولانی). انویدیا از دستورالعمل های ساده اسکالر استفاده می کند که روی ثبات های اسکالر کار می کنند. شتاب دهنده های آن RISC کلاسیک ساده را پیاده سازی می کنند. تعداد رجیستر کارت های گرافیک AMD برابر با GT200 است، اما رجیسترها وکتوری 128 بیتی هستند. هر دستور VLIW روی چندین ثبات 32 بیتی چهار جزئی عمل می کند که شبیه SSE است، اما قابلیت های VLIW بسیار گسترده تر است. این SIMD (Single Instruction Multiple Data) مانند SSE نیست - در اینجا دستورالعمل های هر جفت عملوند می تواند متفاوت و حتی وابسته باشد! به عنوان مثال، اجازه دهید اجزای ثبات A به نام های a1، a2، a3، a4. برای ثبت B - به طور مشابه. می توان با یک دستور که در یک چرخه اجرا می شود محاسبه کرد، به عنوان مثال، عدد a1×b1+a2×b2+a3×b3+a4×b4 یا یک بردار دو بعدی (a1×b1+a2×b2، a3× b3+a4×b4).

این امر به دلیل فرکانس پایین GPU نسبت به CPU و کاهش شدید فرآیندهای فنی در آن امکان پذیر شد سال های گذشته. این به هیچ زمانبندی نیاز ندارد، تقریباً همه چیز در هر ساعت اجرا می شود.

با دستورالعمل های برداری، اوج عملکرد تک دقیق Radeon بسیار بالا است، در ترافلاپس.

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


نمودار شماتیک کار Radeon. تنها یک مینی پردازنده از 20 پردازنده که به صورت موازی کار می کنند نشان داده می شود

تولیدکنندگان GPU، بر خلاف تولیدکنندگان CPU (اول از همه، آنهایی که با x86 سازگار هستند)، به مسائل مربوط به سازگاری محدود نمی شوند. برنامه GPU ابتدا در برخی از کدهای میانی کامپایل می شود، و هنگامی که برنامه اجرا می شود، درایور این کد را در دستورالعمل های ماشین کامپایل می کند. مدل خاص. همانطور که در بالا توضیح داده شد، تولیدکنندگان GPU با ابداع ISA مناسب (معماری مجموعه دستورالعمل) برای GPUهای خود و تغییر آنها از نسلی به نسل دیگر از این مزیت استفاده کردند. در هر صورت، این به دلیل عدم وجود (به عنوان غیر ضروری) رمزگشا، درصدی از عملکرد را اضافه کرد. اما AMD از این هم فراتر رفت و فرمت خود را برای مرتب کردن دستورالعمل ها در کد ماشین ابداع کرد. آنها به صورت متوالی (طبق فهرست برنامه) مرتب نمی شوند، بلکه در بخش ها قرار می گیرند.

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

بخش های دستورالعمل شعب مشروط
بخش 0شعبه 0پیوند به بخش شماره 3 دستورالعمل های حسابی پیوسته
بخش 1شعبه 1پیوند به بخش شماره 4
بخش 2شعبه 2پیوند به بخش شماره 5
بخش هایی از دستورالعمل های حسابی پیوسته
بخش 3دستورالعمل VLIW 0دستورالعمل VLIW 1دستورالعمل VLIW 2دستورالعمل VLIW 3
بخش 4دستورالعمل VLIW 4دستورالعمل VLIW 5
بخش 5دستورالعمل VLIW 6دستورالعمل VLIW 7دستورالعمل VLIW 8دستورالعمل VLIW 9

پردازنده‌های گرافیکی هر دو سازنده (هم Nvidia و هم AMD) دستورالعمل‌های داخلی برای محاسبه سریع توابع ریاضی پایه، ریشه مربع، توان، لگاریتم، سینوس و کسینوس برای اعداد دقیق منفرد در چندین چرخه دارند. بلوک های محاسباتی ویژه ای برای این کار وجود دارد. آنها از نیاز به پیاده سازی تقریب سریع این توابع در شیدرهای هندسی "نشات گرفتند".

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

اما ویژگی بارزتری که منشأ گرافیکی دستگاه را نشان می‌دهد، بلوک‌هایی برای خواندن بافت‌های دو بعدی و سه بعدی با پشتیبانی از درون یابی دو خطی است. آنها به طور گسترده در برنامه های GPU مورد استفاده قرار می گیرند، زیرا خواندن سریعتر و آسانتر آرایه های داده فقط خواندنی را فراهم می کنند. یکی از گزینه های استانداردرفتار یک برنامه GPU این است که آرایه هایی از داده های اولیه را بخواند، آنها را در هسته های محاسباتی پردازش کند و نتیجه را در آرایه دیگری بنویسد، که سپس به CPU بازگردانده می شود. چنین طرحی استاندارد و رایج است، زیرا برای معماری GPU مناسب است. کارهایی که به خواندن و نوشتن فشرده در یک منطقه بزرگ از حافظه جهانی نیاز دارند، بنابراین حاوی وابستگی های داده ای هستند، موازی سازی و پیاده سازی کارآمد در GPU دشوار است. همچنین عملکرد آنها تا حد زیادی به تأخیر حافظه جهانی بستگی دارد که بسیار زیاد است. اما اگر کار با الگوی "خواندن داده ها - پردازش - نوشتن نتیجه" توصیف شود، تقریباً مطمئناً می توانید از اجرای آن در GPU تقویت زیادی دریافت کنید.

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

اگرچه اندازه کش های L1-L2 در کارت های Nvidia و AMD تقریباً یکسان است که مشخصاً ناشی از الزامات بهینه بودن از نظر گرافیک بازی است، اما تأخیر دسترسی به این کش ها به طور قابل توجهی متفاوت است. تأخیر دسترسی انویدیا بالاتر است و کش بافت در Geforce در درجه اول به کاهش بار روی گذرگاه حافظه کمک می کند، نه اینکه مستقیماً سرعت دسترسی به داده ها را افزایش دهد. این مورد در برنامه های گرافیکی قابل توجه نیست، اما برای برنامه های عمومی مهم است. در Radeon، تأخیر حافظه کش بافت کمتر است، اما تأخیر حافظه محلی مینی پردازنده ها بیشتر است. در اینجا یک مثال آورده شده است: برای ضرب بهینه ماتریس در کارت های انویدیا، بهتر است از حافظه محلی استفاده کنید، ماتریس را بلوک به بلوک بارگذاری کنید، و برای AMD، بهتر است به یک کش بافت با تاخیر کم تکیه کنید، عناصر ماتریس را به عنوان خوانده شده مورد نیاز است. اما این یک بهینه سازی نسبتاً ظریف است و برای الگوریتمی که قبلاً به طور اساسی به GPU منتقل شده است.

این تفاوت هنگام استفاده از بافت های سه بعدی نیز خود را نشان می دهد. یکی از اولین معیارهای محاسباتی GPU که مزیتی جدی برای AMD نشان داد، فقط از بافت های سه بعدی استفاده کرد، زیرا با آرایه داده های سه بعدی کار می کرد. و تأخیر دسترسی به بافت در Radeon به طور قابل توجهی سریعتر است، و کیس 3D علاوه بر این از نظر سخت افزاری بهینه تر است.

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

محدودیت های سری Radeon 47xx

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

مزایا و معایب Evergreen

اگر محصولات AMD و Nvidia را با هم مقایسه کنیم، از نظر پردازش گرافیکی، سری 5xxx مانند یک GT200 بسیار قدرتمند به نظر می رسد. آنقدر قدرتمند که در اوج عملکرد حدود دو و نیم برابر فرمی را پشت سر گذاشته است. به خصوص پس از قطع پارامترهای کارت گرافیک های جدید انویدیا، تعداد هسته ها کاهش یافت. اما ظاهر کش L2 در فرمی اجرای برخی از الگوریتم ها را بر روی GPU ساده می کند و در نتیجه دامنه GPU را گسترش می دهد. جالب اینجاست که برای برنامه‌های GT200 CUDA به‌خوبی بهینه‌سازی شده، نوآوری‌های معماری Fermi اغلب هیچ کاری انجام نمی‌دهند. آنها متناسب با افزایش تعداد ماژول های محاسباتی شتاب گرفتند، یعنی کمتر از دو برابر (برای اعداد دقیق) یا حتی کمتر، زیرا پهنای باند حافظه افزایش نمی یافت (یا به دلایل دیگر).

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

اما Radeon دارای مساحت قالب کوچکتر، اتلاف حرارت کمتر، مصرف برق، بازده بالاتر و بر این اساس هزینه کمتر است. و به طور مستقیم در مشکلات گرافیک سه بعدی، بهره فرمی، در صورت وجود، بسیار کمتر از تفاوت در مساحت کریستال است. این تا حد زیادی به دلیل این واقعیت است که معماری محاسباتی Radeon، با 16 واحد محاسباتی در هر مینی پردازنده، یک جبهه موج 64 رشته ای، و دستورالعمل های برداری VLIW، برای وظیفه اصلی خود - محاسبات سایه زن های گرافیکی - عالی است. برای اکثریت قریب به اتفاق کاربران عادیعملکرد و قیمت بازی در اولویت هستند.

از نقطه نظر برنامه‌های حرفه‌ای و علمی، معماری Radeon بهترین نسبت قیمت به عملکرد، عملکرد بر وات و عملکرد مطلق را در کارهایی ارائه می‌کند که اصولاً به خوبی با معماری GPU مطابقت دارد و امکان موازی‌سازی و برداری را فراهم می‌کند.

به عنوان مثال، در یک مسئله انتخاب کلید کاملا موازی و به راحتی قابل برداری، Radeon چندین برابر سریعتر از Geforce و چندین ده برابر سریعتر از CPU است.

این با مفهوم کلی AMD Fusion مطابقت دارد که بر اساس آن GPUها باید مکمل CPU باشند و در آینده در خود هسته CPU ادغام شوند، درست همانطور که قبلاً پردازنده مشترک ریاضی از یک تراشه جداگانه به هسته پردازنده منتقل شده بود (این اتفاق در مورد بیست سال پیش، قبل از ظهور اولین پردازنده های پنتیوم). GPU یکپارچه خواهد شد هسته گرافیکیو یک پردازنده کمکی برداری برای کارهای جریانی.

Radeon از یک تکنیک پیچیده برای مخلوط کردن دستورالعمل‌ها از جبهه‌های موج مختلف هنگام اجرا توسط ماژول‌های تابع استفاده می‌کند. انجام این کار آسان است زیرا دستورالعمل ها کاملاً مستقل هستند. این اصل مشابه اجرای خط لوله دستورات مستقل توسط CPUهای مدرن است. ظاهراً، این امکان اجرای موثر دستورات VLIW بردار پیچیده، چند بایتی را فراهم می‌کند. در CPU، این به یک زمان‌بندی پیچیده برای شناسایی دستورالعمل‌های مستقل یا استفاده از فناوری Hyper-Threading نیاز دارد، که همچنین دستورالعمل‌های مستقل شناخته شده را از رشته‌های مختلف به CPU ارائه می‌کند.

اندازه گیری 0نوار 1اندازه گیری 2اندازه گیری 3نوار 4نوار 5نوار 6نوار 7ماژول VLIW
جلو موج 0جبهه موج 1جلو موج 0جبهه موج 1جلو موج 0جبهه موج 1جلو موج 0جبهه موج 1
instr. 0instr. 0instr. 16instr. 16instr. 32instr. 32instr. 48instr. 48VLIW0
instr. یکیVLIW1
instr. 2VLIW2
instr. 3VLIW3
instr. چهارVLIW4
instr. 5VLIW5
instr. 6VLIW6
instr. 7VLIW7
instr. هشتVLIW8
instr. 9VLIW9
instr. دهVLIW10
instr. یازدهVLIW11
instr. 12VLIW12
instr. 13VLIW13
instr. چهاردهVLIW14
instr. پانزدهVLIW15

128 دستورالعمل دو جبهه موج که هر کدام از 64 عملیات تشکیل شده است توسط 16 ماژول VLIW در هشت سیکل اجرا می شود. یک تناوب وجود دارد، و هر ماژول در واقع دارای دو چرخه برای اجرای یک دستورالعمل کامل است، مشروط بر اینکه شروع به اجرای یک دستور جدید به صورت موازی در چرخه دوم کند. این احتمالاً به اجرای سریع یک دستور VLIW مانند a1×a2+b1×b2+c1×c2+d1×d2 کمک می‌کند، یعنی هشت دستورالعمل را در هشت چرخه اجرا کنید. (به طور رسمی، به نظر می رسد، یک در هر ساعت.)

ظاهرا انویدیا این فناوری را ندارد. و در غیاب VLIW، عملکرد بالا با استفاده از دستورالعمل‌های اسکالر نیاز به فرکانس بالای عملیات دارد، که به طور خودکار اتلاف گرما را افزایش می‌دهد و تقاضاهای بالایی را برای فرآیند ایجاد می‌کند (برای وادار کردن مدار به کار در فرکانس بالاتر).

نقطه ضعف Radeon از نظر محاسبات پردازنده گرافیکی، بیزاری بزرگ برای انشعاب است. پردازنده‌های گرافیکی معمولاً به دلیل فناوری بالا برای اجرای دستورالعمل‌ها، انشعاب را ترجیح نمی‌دهند: بلافاصله توسط گروهی از رشته‌ها با یک آدرس برنامه. (به هر حال، این تکنیک SIMT نامیده می شود: یک دستورالعمل - موضوعات متعدد (یک دستورالعمل - رشته های متعدد)، به قیاس با SIMD، که در آن یک دستورالعمل یک عملیات را با داده های مختلف انجام می دهد.) . واضح است که اگر برنامه کاملاً برداری نباشد، هر چه اندازه تاب یا جبهه موج بزرگتر باشد، بدتر است، زیرا زمانی که مسیر از طریق برنامه واگرا می شود، رشته های همسایه تشکیل می شوند. گروه های بیشتر، که باید به صورت متوالی (سریال) اجرا شود. فرض کنید همه رشته‌ها پراکنده شده‌اند، سپس در مورد اندازه چرخش 32 رشته، برنامه 32 برابر کندتر اجرا می‌شود. و در مورد سایز 64، مانند Radeon، 64 برابر کندتر است.

این یک تظاهر قابل توجه، اما نه تنها تجلی "ناراحتی" است. در کارت‌های ویدئویی انویدیا، هر ماژول کاربردی، که در غیر این صورت هسته CUDA نامیده می‌شود، دارای یک واحد پردازش شاخه ویژه است. و در کارت های ویدیویی Radeon برای 16 ماژول محاسباتی، تنها دو واحد کنترل انشعاب وجود دارد (آنها از حوزه واحدهای حسابی مشتق شده اند). بنابراین حتی پردازش ساده یک دستورالعمل شاخه شرطی، حتی اگر نتیجه آن برای همه رشته‌ها در جبهه موج یکسان باشد، زمان بیشتری می‌برد. و سرعت کاهش می یابد.

AMD همچنین CPU تولید می کند. آنها بر این باورند که برای برنامه هایی با شاخه های زیاد، CPU هنوز مناسب تر است و GPU برای برنامه های صرفاً برداری در نظر گرفته شده است.

بنابراین Radeon برنامه‌نویسی با کارایی کمتری را به طور کلی ارائه می‌کند، اما در بسیاری از موارد قیمت و عملکرد بهتری را ارائه می‌دهد. به عبارت دیگر، برنامه‌های کمتری نسبت به برنامه‌هایی که می‌توانند به طور مؤثر بر روی Fermi اجرا شوند، وجود دارند که می‌توانند به طور مؤثر (مفید) از CPU به Radeon منتقل شوند. اما از سوی دیگر، مواردی که می توانند به طور موثر منتقل شوند، از بسیاری جهات روی Radeon کارآمدتر خواهند بود.

API برای محاسبات GPU

خودشان مشخصات فنی Radeon جذاب به نظر می رسد، حتی اگر نیازی به ایده آل کردن و مطلق کردن محاسبات GPU نباشد. اما برای عملکرد، نرم افزار لازم برای توسعه و اجرای یک برنامه GPU مهم نیست - کامپایلرهایی از یک زبان سطح بالا و زمان اجرا، یعنی درایوری که بین بخشی از برنامه در حال اجرا بر روی CPU و GPU تعامل دارد. خود حتی مهمتر از مورد CPU است: CPU برای مدیریت انتقال داده نیازی به درایور ندارد و از نظر کامپایلر، GPU پیچیده تر است. به عنوان مثال، کامپایلر باید با حداقل تعداد رجیسترها برای ذخیره نتایج میانی محاسبات، و همچنین فراخوانی های تابع درون خطی منظم، دوباره با استفاده از حداقل رجیسترها بسنده کند. از این گذشته، هرچه یک رشته از رجیسترهای کمتری استفاده کند، می‌توانید رشته‌های بیشتری را اجرا کنید و GPU به طور کامل بارگذاری شود، و زمان دسترسی به حافظه را بهتر پنهان می‌کند.

و بنابراین پشتیبانی نرم افزاری برای محصولات Radeon هنوز از توسعه سخت افزار عقب است. (برخلاف وضعیت انویدیا، که در آن انتشار سخت‌افزار با تأخیر مواجه شد و محصول به صورت stripped-down منتشر شد.) اخیراً، کامپایلر OpenCL AMD در وضعیت بتا قرار داشت، با نقص‌های فراوان. اغلب اوقات کد اشتباهی تولید می‌کند، یا از کامپایل کد از روی کد منبع صحیح خودداری می‌کند، یا خودش خطا می‌دهد و از کار می‌افتد. فقط در پایان بهار نسخه ای با عملکرد بالا منتشر شد. همچنین بدون خطا نیست ، اما تعداد آنها به میزان قابل توجهی کمتر است و معمولاً هنگام تلاش برای برنامه ریزی چیزی در آستانه صحت در حاشیه ظاهر می شوند. به عنوان مثال، آنها با نوع uchar4 کار می کنند که یک متغیر چهار جزئی 4 بایتی را مشخص می کند. این نوع در مشخصات OpenCL است، اما ارزش کار با آن در Radeon را ندارد، زیرا ثبات ها 128 بیتی هستند: همان چهار جزء، اما 32 بیتی. و چنین متغیر uchar4 همچنان یک رجیستر کامل را اشغال می‌کند، فقط عملیات اضافی بسته‌بندی و دسترسی به اجزای جداگانه بایت هنوز مورد نیاز است. یک کامپایلر نباید هیچ اشکالی داشته باشد، اما هیچ کامپایلری بدون اشکال وجود ندارد. حتی کامپایلر اینتل بعد از 11 نسخه دارای خطاهای کامپایل است. باگ های شناسایی شده در نسخه بعدی برطرف می شوند که نزدیک به پاییز منتشر خواهند شد.

اما هنوز چیزهای زیادی وجود دارد که باید بهبود یابد. برای مثال، تا کنون، درایور استاندارد GPU برای Radeon از محاسبات GPU با استفاده از OpenCL پشتیبانی نمی‌کند. کاربر باید یک بسته ویژه اضافی را دانلود و نصب کند.

اما مهمترین چیز عدم وجود هیچ گونه کتابخانه ای از توابع است. برای اعداد حقیقی با دقت دو برابر، حتی یک سینوس، کسینوس و توان وجود ندارد. خب، این برای جمع/ضرب ماتریس لازم نیست، اما اگر می‌خواهید چیز پیچیده‌تری را برنامه‌ریزی کنید، باید همه توابع را از ابتدا بنویسید. یا منتظر انتشار SDK جدید باشید. ACML به زودی منتشر می شود ( هسته AMDکتابخانه ریاضی) برای خانواده Evergreen GPU با پشتیبانی از توابع اولیه ماتریس.

در حال حاضر، به گفته نویسنده مقاله، استفاده از Direct Compute 5.0 API برای برنامه نویسی کارت های گرافیک Radeon واقعی به نظر می رسد، طبیعتاً با در نظر گرفتن محدودیت ها: جهت گیری به پلت فرم ویندوز 7 و ویندوز ویستا. مایکروسافت تجربه زیادی در ساخت کامپایلرها دارد و ما می توانیم به زودی انتظار انتشار کاملاً کاربردی را داشته باشیم، مایکروسافت مستقیماً به این موضوع علاقه دارد. اما محاسبه مستقیم بر نیازهای برنامه های کاربردی تعاملی متمرکز است: محاسبه چیزی و تجسم فوری نتیجه - به عنوان مثال، جریان یک مایع بر روی یک سطح. این بدان معنا نیست که نمی توان از آن صرفاً برای محاسبات استفاده کرد، اما این هدف طبیعی آن نیست. به عنوان مثال، مایکروسافت قصد ندارد توابع کتابخانه ای را به Direct Compute اضافه کند - دقیقاً آنهایی که AMD در حال حاضر ندارد. یعنی آنچه که اکنون می تواند به طور موثر بر روی Radeon محاسبه شود - برخی از برنامه های نه چندان پیچیده - می تواند روی Direct Compute نیز پیاده سازی شود که بسیار ساده تر از OpenCL است و باید پایدارتر باشد. به علاوه، این برنامه کاملاً قابل حمل است و روی هر دو Nvidia و AMD اجرا می شود، بنابراین شما فقط باید یک بار برنامه را کامپایل کنید، در حالی که پیاده سازی های OpenCL SDK انویدیا و AMD دقیقاً سازگار نیستند. (به این معنا که اگر یک برنامه OpenCL بر روی یک سیستم AMD با استفاده از AMD OpenCL SDK توسعه دهید، ممکن است به راحتی در Nvidia اجرا نشود. ممکن است لازم باشد همان متن را با استفاده از Nvidia SDK کامپایل کنید. و البته برعکس. )

سپس، قابلیت‌های اضافی زیادی در OpenCL وجود دارد، زیرا OpenCL به عنوان یک زبان برنامه‌نویسی جهانی و API برای طیف گسترده‌ای از سیستم‌ها در نظر گرفته شده است. و GPU و CPU و Cell. بنابراین در صورتی که بخواهید فقط یک برنامه برای یک سیستم کاربر معمولی بنویسید (پردازنده به اضافه کارت ویدئو)، به نظر نمی رسد OpenCL، به اصطلاح، "بسیار سازنده" باشد. هر تابع ده پارامتر دارد و 9 تای آن ها باید روی 0 تنظیم شود و برای تنظیم هر پارامتر باید تابع خاصی را فراخوانی کنید که دارای پارامتر نیز باشد.

و مهمترین مزیت فعلی Direct Compute این است که کاربر نیازی به نصب بسته خاصی ندارد: هر چیزی که مورد نیاز است قبلاً در DirectX 11 وجود دارد.

مشکلات توسعه محاسبات GPU

اگر حوزه رایانه‌های شخصی را در نظر بگیریم، وضعیت به این صورت است: وظایف زیادی که نیاز به قدرت محاسباتی زیادی داشته باشند و به شدت در یک پردازنده دو هسته‌ای معمولی کمبود داشته باشند، وجود ندارد. انگار هیولاهای پرخور بزرگ اما دست و پا چلفتی از دریا به خشکی خزیده بودند و تقریباً در خشکی چیزی برای خوردن وجود نداشت. و مکان های اولیه سطح زمین در حال کاهش هستند و یاد می گیرند که کمتر مصرف کنند، همانطور که همیشه در هنگام کمبود منابع طبیعی اتفاق می افتد. اگر امروز همان نیاز 10-15 سال پیش به عملکرد وجود داشت، محاسبات GPU با صدای بلند پذیرفته می شد. و بنابراین مشکلات سازگاری و پیچیدگی نسبی برنامه نویسی GPU به منصه ظهور می رسد. بهتر است برنامه ای بنویسید که روی همه سیستم ها اجرا شود تا برنامه ای که سریع باشد اما فقط روی GPU اجرا شود.

چشم انداز GPU ها از نظر استفاده در برنامه های حرفه ای و بخش ایستگاه های کاری تا حدودی بهتر است، زیرا تقاضا برای عملکرد بیشتر است. پلاگین هایی برای ویرایشگرهای سه بعدی مجهز به GPU در حال ظهور هستند: به عنوان مثال، برای رندر با ردیابی پرتو - نباید با رندر معمولی GPU اشتباه گرفته شود! چیزی برای ویرایشگرهای دوبعدی و ارائه نیز با ایجاد سریع‌تر جلوه‌های پیچیده نشان داده می‌شود. برنامه های پردازش ویدیو نیز به تدریج از GPU پشتیبانی می کنند. وظایف فوق، با توجه به ماهیت موازی آنها، به خوبی با معماری GPU مطابقت دارند، اما اکنون یک پایه کد بسیار بزرگ ایجاد شده است، اشکال زدایی شده است، برای همه قابلیت های CPU بهینه شده است، بنابراین ظاهر شدن پیاده سازی های خوب GPU زمان می برد.

در این بخش، چنین نقاط ضعفی از GPU نیز آشکار می شود، مانند مقدار محدود حافظه ویدئویی - حدود 1 گیگابایت برای GPU های معمولی. یکی از اصلی ترین عواملی که باعث کاهش کارایی برنامه های GPU می شود، نیاز به تبادل اطلاعات بین CPU و GPU از طریق گذرگاه کند است و به دلیل محدودیت حافظه، باید اطلاعات بیشتری منتقل شود. و در اینجا مفهوم AMD از ترکیب GPU و CPU در یک ماژول امیدوارکننده به نظر می رسد: شما می توانید پهنای باند بالای حافظه گرافیکی را فدای دسترسی آسان و ساده به حافظه مشترک و همچنین با تأخیر کمتر کنید. این پهنای باند بالای حافظه ویدئویی DDR5 به طور مستقیم تقاضای بیشتری دارد برنامه های گرافیکینسبت به اکثر برنامه های محاسباتی GPU بطور کلی، حافظه مشترک GPU و CPU به سادگی دامنه GPU را به طور قابل توجهی گسترش می دهند و استفاده از قابلیت های محاسباتی آن را در وظایف فرعی کوچک برنامه ها ممکن می سازند.

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

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

یکی از مهمترین ویژگی های پنهاندر به‌روزرسانی اخیر ویندوز 10، این امکان وجود دارد که بررسی کنید کدام برنامه‌ها از واحد پردازش گرافیکی (GPU) شما استفاده می‌کنند. اگر تا به حال Task Manager را باز کرده باشید، احتمالاً به میزان استفاده از CPU خود نگاه کرده اید تا ببینید کدام برنامه ها بیشترین نیاز به CPU را دارند. AT آخرین به روزرسانی هایک ویژگی مشابه اما برای GPU های GPU اضافه شده است. این کمک می کند تا بدون دانلود نرم افزار شخص ثالث درک کنید که چقدر نرم افزار و بازی های شما روی GPU شما فشرده هستند. ویژگی جالب دیگری وجود دارد که به تخلیه CPU شما به GPU کمک می کند. توصیه می کنم نحوه انتخاب را بخوانید.

چرا در Task Manager یک GPU ندارم؟

متأسفانه همه کارت‌های گرافیکی نمی‌توانند آمار مورد نیاز ویندوز برای خواندن GPU را ارائه دهند. برای اطمینان، می توانید به سرعت از ابزار تشخیصی DirectX برای آزمایش این فناوری استفاده کنید.

  1. کلیک " شروع کنید"و در جستجو بنویسید dxdiagبرای اجرای DirectX Diagnostic Tool.
  2. برو به برگه " صفحه نمایش،درست در ستون رانندگان"شما باید داشته مدل WDDMنسخه بالاتر از 2.0 برای استفاده از نمودارهای GPU در مدیر وظیفه.

Graph GPU را در Task Manager فعال کنید

برای مشاهده میزان استفاده از GPU برای هر برنامه، باید Task Manager را باز کنید.

  • دکمه ترکیبی را فشار دهید Ctrl + Shift + Escبرای باز کردن Task Manager.
  • کلیک کلیک راستدر قسمت خالی روی Task Manager کلیک کنید " نام"و از منوی کشویی چک کنید پردازنده گرافیکیهمچنین می توانید توجه داشته باشید هسته GPUتا ببینید کدام برنامه ها از آن استفاده می کنند.
  • اکنون در Task Manager نمودار GPU و هسته GPU در سمت راست قابل مشاهده است.


عملکرد کلی GPU را مشاهده کنید

شما می توانید استفاده کلی از GPU را برای نظارت و تجزیه و تحلیل تحت بارهای سنگین ردیابی کنید. در این مورد، می توانید هر آنچه را که نیاز دارید در " کارایی"با انتخاب پردازنده گرافیکی


هر عنصر GPU به نمودارهای جداگانه تقسیم می شود تا به شما بینش بیشتری در مورد نحوه استفاده از GPU شما بدهد. اگر می خواهید نمودارهای نمایش داده شده را تغییر دهید، می توانید روی فلش کوچک کنار عنوان هر کار کلیک کنید. این صفحه همچنین نسخه و تاریخ درایور شما را نشان می دهد که جایگزین خوبی برای استفاده از DXDiag یا Device Manager است.


هیچ وقت هسته های زیادی وجود ندارد...

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

این مقاله مفاهیم اساسی را تشریح می‌کند تا بتوان در تئوری بهینه‌سازی gpu و قوانین اساسی پیمایش را آسان‌تر کرد، به‌گونه‌ای که باید کمتر به این مفاهیم دسترسی داشت.

دلایل موثر بودن پردازنده‌های گرافیکی برای مقابله با حجم زیادی از داده‌هایی که نیاز به پردازش دارند:

  • آنها فرصت های بسیار خوبی برای اجرای موازی وظایف دارند (پردازنده های بسیار زیاد)
  • پهنای باند حافظه بالا

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

یکی از وظایف بهینه سازی استفاده از حداکثر توان - برای افزایش عملکرد است توان عملیاتی(در حالت ایده آل، باید برابر با پهنای باند حافظه باشد).

برای بهبود استفاده از پهنای باند:

  • حجم اطلاعات را افزایش دهید - از پهنای باند به طور کامل استفاده کنید (به عنوان مثال، هر جریان با float4 کار می کند)
  • کاهش تأخیر - تأخیر بین عملیات

تاخیر- فاصله زمانی بین لحظاتی که کنترل کننده یک سلول حافظه خاص را درخواست می کند و لحظه ای که داده ها برای اجرای دستورالعمل ها در دسترس پردازنده قرار می گیرد. ما به هیچ وجه نمی توانیم خود تأخیر را تحت تأثیر قرار دهیم - این محدودیت ها در سطح سخت افزار وجود دارد. به دلیل این تأخیر است که پردازنده می تواند همزمان چندین رشته را ارائه دهد - در حالی که رشته A درخواست داده است تا حافظه را به آن اختصاص دهد، رشته B می تواند چیزی را محاسبه کند و رشته C می تواند منتظر بماند تا داده های درخواستی برسد.

نحوه کاهش تأخیر در صورت استفاده از همگام سازی:

  • تعداد نخ ها را در یک بلوک کاهش دهید
  • تعداد گروه های بلوک را افزایش دهید

استفاده کامل از منابع GPU - اشغال GPU

در گفتگوهایی که در مورد بهینه سازی وجود دارد، این اصطلاح اغلب چشمک می زند - اشغال gpuیا اشغال هسته- کارایی استفاده از منابع-ظرفیت های کارت گرافیک را منعکس می کند. به طور جداگانه، توجه می کنم که حتی اگر از همه منابع استفاده کنید، این به این معنی نیست که شما از آنها به درستی استفاده می کنید.

قدرت محاسباتی GPU صدها پردازنده است که حریص محاسبات هستند، هنگام ایجاد یک برنامه - هسته (هسته) - بار توزیع بار روی آنها بر دوش برنامه نویس می افتد. یک اشتباه می‌تواند منجر به بی‌کاری بیشتر این منابع گرانبها شود. حالا دلیلش را توضیح می دهم. باید از دور شروع کرد.

اجازه دهید به شما یادآوری کنم که تار ( پیچ و تاب در اصطلاحات NVidia، جبهه موج - در اصطلاح AMD) - مجموعه ای از رشته ها که به طور همزمان عملکرد هسته یکسانی را بر روی پردازنده انجام می دهند. رشته‌ها که توسط برنامه‌نویس به بلوک‌ها متحد شده‌اند، توسط زمان‌بندی رشته (به طور جداگانه برای هر چند پردازنده) به تاب تقسیم می‌شوند - در حالی که یک پیچ در حال اجرا است، دومی منتظر پردازش درخواست‌های حافظه است و غیره. اگر برخی از رشته‌های تار هنوز محاسبات را انجام می‌دهند، در حالی که برخی دیگر از قبل بهترین کار خود را انجام داده‌اند، در این صورت استفاده ناکارآمدی از منبع محاسباتی وجود دارد - معمولاً به عنوان توان بی‌کار از آن یاد می‌شود.

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

برای کاهش زمان خرابی چند پردازنده در هنگام اجرای Warp:

  • به حداقل رساندن موانع زمان انتظار
  • به حداقل رساندن واگرایی منطق اجرا در تابع هسته

برای حل موثر این مشکل، درک چگونگی شکل گیری تارها (برای مواردی با چندین بعد) منطقی است. در واقع، ترتیب ساده است - ابتدا در X، سپس در Y، و آخرین در Z.

هسته با بلوک های 64×16 راه اندازی می شود، رشته ها به ترتیب X، Y، Z به تاب تقسیم می شوند - یعنی. 64 عنصر اول به دو تار تقسیم می شوند، سپس دومی و غیره.

هسته با بلوک های 16x64 شروع می شود. 16 عنصر اول و دوم به تار اول، المان سوم و چهارم به تار دوم اضافه می شوند و به همین ترتیب.

نحوه کاهش واگرایی (به یاد داشته باشید - انشعاب همیشه دلیل افت عملکرد بحرانی نیست)

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

چگونه از منابع GPU بیشترین بهره را ببریم

متاسفانه منابع GPU نیز محدودیت هایی دارند. و به طور دقیق، قبل از راه‌اندازی تابع هسته، تعریف محدودیت‌ها و در نظر گرفتن این محدودیت‌ها هنگام توزیع بار منطقی است. چرا مهم است؟

کارت‌های ویدئویی دارای محدودیت‌هایی در تعداد کل رشته‌هایی هستند که یک چند پردازنده می‌تواند اجرا کند، حداکثر تعداد رشته‌ها در یک بلوک، حداکثر تعداد تاب روی یک پردازنده، محدودیت‌هایی در انواع مختلف حافظه و غیره. همه این اطلاعات را می توان هم به صورت برنامه نویسی، از طریق API مربوطه و هم قبلاً با استفاده از ابزارهای کاربردی از SDK درخواست کرد. (ماژول های DeviceQuery برای دستگاه های NVidia، ماژول های CLinfo برای کارت های ویدئویی AMD).

تمرین عمومی:

  • تعداد بلوک‌های رشته/گروه‌های کاری باید مضربی از تعداد پردازنده‌های جریانی باشد
  • اندازه بلوک/گروه کاری باید مضربی از اندازه Warp باشد

در عین حال، باید در نظر داشت که حداقل مطلق - 3-4 تاب / جبهه به طور همزمان روی هر پردازنده در حال چرخش است، راهنمای عاقلانه توصیه می کنند که از در نظر گرفتن ادامه دهید - حداقل هفت مسیر. در عین حال - محدودیت های آهن را فراموش نکنید!

نگه داشتن تمام این جزئیات در ذهن شما به سرعت خسته کننده می شود، بنابراین، برای محاسبه اشغال gpu، NVidia یک ابزار غیرمنتظره ارائه کرد - یک ماشین حساب اکسل (!) پر از ماکرو. در آنجا می‌توانید اطلاعاتی درباره حداکثر تعداد رشته‌ها برای SM، تعداد ثبت‌ها و اندازه حافظه مشترک (اشتراک‌گذاری شده) موجود در آن وارد کنید. پردازنده جریانیو پارامترهای مورد استفاده برای راه اندازی توابع - و درصدی از کارایی استفاده از منابع را نشان می دهد (و موهای خود را پاره می کنید و متوجه می شوید که ثبت نام کافی برای استفاده از همه هسته ها ندارید).

اطلاعات استفاده:
http://docs.nvidia.com/cuda/cuda-c-best-practices-guide/#calculating-occupancy

GPU و عملیات حافظه

کارت های ویدئویی برای عملیات حافظه 128 بیتی بهینه شده اند. آن ها در حالت ایده آل، هر دستکاری حافظه، در حالت ایده آل، باید 4 مقدار چهار بایتی را در یک زمان تغییر دهد. مزاحمت اصلی برای برنامه نویس این است که کامپایلرهای مدرن برای GPU قادر به بهینه سازی چنین مواردی نیستند. این باید درست در کد تابع انجام شود و به طور متوسط ​​کسری از درصد افزایش عملکرد را به همراه دارد. فرکانس درخواست های حافظه تاثیر بسیار بیشتری بر عملکرد دارد.

مشکل به شرح زیر است - هر درخواست در پاسخ یک قطعه داده را که مضربی از 128 بیت است برمی گرداند. و هر رشته فقط از یک چهارم آن استفاده می کند (در مورد یک متغیر معمولی چهار بایت). هنگامی که رشته های مجاور به طور همزمان با داده هایی که به صورت متوالی در سلول های حافظه قرار دارند کار می کنند، این امر تعداد کل دسترسی های حافظه را کاهش می دهد. این پدیده را عملیات خواندن و نوشتن ترکیبی می نامند ( دسترسی ادغام شده - خوب! هم بخوان و هم بنویس) - و با سازماندهی صحیح کد ( دسترسی سریع به بخش پیوسته حافظه - بد!) می تواند عملکرد را به طور قابل توجهی بهبود بخشد. هنگام سازماندهی هسته خود - به یاد داشته باشید - دسترسی پیوسته - در عناصر یک ردیف حافظه، کار با عناصر یک ستون دیگر چندان کارآمد نیست. جزئیات بیشتری می خواهید؟ من این پی دی اف را دوست داشتم - یا گوگل برای " تکنیک های ادغام حافظه “.

موقعیت پیشرو در نامزدی "گلوگاه" توسط یک عملیات حافظه دیگر اشغال شده است - کپی داده ها از حافظه میزبان به GPU . کپی کردن به هر حال اتفاق نمی افتد، اما از یک ناحیه حافظه که به طور خاص توسط راننده و سیستم اختصاص داده شده است: هنگامی که درخواستی برای کپی داده ها ارائه می شود، سیستم ابتدا این داده ها را در آنجا کپی می کند و تنها پس از آن آن را در GPU آپلود می کند. سرعت انتقال داده ها توسط پهنای باند محدود می شود باس PCI Express xN (که در آن N تعداد خطوط داده است) که از طریق آن کارت های ویدئویی مدرن با میزبان ارتباط برقرار می کنند.

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

و در نهایت، کمی بیشتر در مورد حافظه. حافظه مشترک روی چند پردازنده معمولاً به شکل بانک های حافظه حاوی کلمات 32 بیتی - داده سازماندهی می شود. تعداد بانک ها به طور سنتی از یک نسل GPU به نسل دیگر متفاوت است - 16/32 اگر هر رشته اطلاعات را از یک بانک جداگانه درخواست کند، همه چیز خوب است. در غیر این صورت، چندین درخواست خواندن / نوشتن به یک بانک دریافت می شود و ما دریافت می کنیم - یک تضاد ( تضاد بانک حافظه مشترک). چنین تماس های متناقضی سریالی می شوند و بنابراین به صورت متوالی اجرا می شوند، نه به صورت موازی. اگر همه رشته ها به یک بانک دسترسی داشته باشند، از پاسخ "پخش" استفاده می شود ( پخش) و هیچ تعارضی وجود ندارد. چندین راه برای مقابله موثر با تضادهای دسترسی وجود دارد، من آن را دوست داشتم شرح تکنیک های اصلی برای خلاص شدن از تضاد دسترسی به بانک های حافظه – .

چگونه عملیات ریاضی را سریعتر انجام دهیم؟ یادت باشد:

  • محاسبات با دقت دوگانه، بار عملیات سنگین با fp64 >> fp32 هستند
  • ثابت های فرم 3.13 در کد، به طور پیش فرض، به عنوان fp64 تفسیر می شوند اگر به صراحت 3.14f را مشخص نکنید.
  • برای بهینه سازی ریاضیات، مشورت در راهنماها اضافی نخواهد بود - و آیا پرچم هایی برای کامپایلر وجود دارد
  • فروشندگان ویژگی‌هایی را در SDK خود گنجانده‌اند که از ویژگی‌های دستگاه برای دستیابی به عملکرد (اغلب به قیمت قابل حمل بودن) بهره می‌برند.

برای توسعه دهندگان CUDA منطقی است که به این مفهوم توجه زیادی داشته باشند جریان متفاوت،به شما این امکان را می دهد که چندین عملکرد اصلی را به طور همزمان روی یک دستگاه اجرا کنید یا کپی ناهمزمان داده ها را از میزبان به دستگاه در طول اجرای عملکردها ترکیب کنید. OpenCL هنوز چنین عملکردی را ارائه نمی دهد 🙁

آشغال های پروفایل:

NVifia Visual Profiler یک ابزار جالب است که هر دو هسته CUDA و OpenCL را تجزیه و تحلیل می کند.

P.S. به‌عنوان یک راهنمای بهینه‌سازی طولانی‌تر، می‌توانم جستجوی انواع مختلف را در گوگل توصیه کنم بهترین راهنمای عمل برای OpenCL و CUDA.

  • ,

وقتی صحبت از محاسبات موازی روی پردازنده گرافیکی شد، باید به یاد داشته باشیم که در چه زمانی زندگی می کنیم، امروز زمانی است که همه چیز در جهان آنقدر شتاب می گیرد که زمان را از دست می دهیم و متوجه سرعت آن نمی شویم. هر کاری که ما انجام می دهیم با دقت و سرعت پردازش اطلاعات بالا در ارتباط است، در چنین شرایطی قطعاً به ابزارهایی نیاز داریم تا بتوانیم تمام اطلاعاتی را که در اختیار داریم پردازش کنیم و آنها را به داده تبدیل کنیم، علاوه بر این، در مورد چنین وظایفی باید به یاد داشته باشیم که این وظایف نه تنها برای سازمان های بزرگ یا شرکت های بزرگ ضروری است، بلکه کاربران عادی نیز اکنون نیاز به حل چنین مشکلاتی دارند که وظایف حیاتی خود را در ارتباط با فناوری های پیشرفته در خانه حل می کنند. کامپیوترهای شخصی! ظهور NVIDIA CUDA تعجب آور نبود، بلکه موجه بود، زیرا به محض اینکه نیاز به پردازش کارهای بسیار وقت گیر در رایانه شخصی نسبت به قبل خواهد بود. این کار که قبلاً زمان زیادی می برد ، اکنون به ترتیب چند دقیقه طول می کشد ، این روی تصویر کلی کل جهان تأثیر می گذارد!

GPU Computing چیست؟

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

CUDA چیست؟

CUDA یک فناوری برای برنامه‌نویسی الگوریتم‌ها به زبان C ساده‌شده است که بر روی پردازنده‌های گرافیکی نسل هشتم و شتاب‌دهنده‌های GeForce قدیمی‌تر و همچنین کارت‌های Quadro و Tesla مربوطه از NVIDIA اجرا می‌شود. CUDA به شما این امکان را می دهد که توابع خاصی را در متن یک برنامه C قرار دهید. این توابع به زبان برنامه نویسی ساده C نوشته شده و بر روی GPU اجرا می شوند. نسخه اولیه CUDA SDK در 15 فوریه 2007 منتشر شد. برای ترجمه موفقیت آمیز کد در این زبان، CUDA SDK شامل کامپایلر C خود است خط فرمان nvcc از NVIDIA. کامپایلر nvcc بر اساس کامپایلر را باز کنید Open64 و برای ترجمه کد میزبان (اصلی، کد کنترل) و کد دستگاه (کد سخت افزاری) (فایل هایی با پسوند cu) به فایل های شی مناسب برای ساختن برنامه یا کتابخانه نهایی در هر محیط برنامه نویسی، به عنوان مثال، طراحی شده است. ، در Microsoft Visual Studio.

قابلیت های فناوری

  1. زبان استاندارد C برای توسعه موازی برنامه های GPU.
  2. کتابخانه های آماده تحلیل عددی برای تبدیل فوریه سریع و بسته اصلی برنامه های جبر خطی.
  3. درایور اختصاصی CUDA برای محاسبات با انتقال سریع داده بین GPU و CPU.
  4. امکان تعامل درایور CUDA با درایورهای گرافیکی OpenGL و DirectX.
  5. پشتیبانی اتاق عمل سیستم های لینوکس 32/64 بیتی، ویندوز XP 32/64 بیتی و MacOS.

مزایای فناوری

  1. رابط برنامه نویسی برنامه CUDA (CUDA API) بر اساس زبان برنامه نویسی استاندارد C با برخی محدودیت ها ساخته شده است. این فرآیند یادگیری معماری CUDA را ساده و روان می کند.
  2. حافظه مشترک 16 کیلوبایتی بین رشته ها را می توان برای کش سازماندهی شده توسط کاربر با پهنای باند بیشتر نسبت به هنگام واکشی از بافت های معمولی استفاده کرد.
  3. تراکنش های کارآمدتر بین حافظه CPU و حافظه ویدئویی.
  4. پشتیبانی کامل سخت افزاری برای عملیات اعداد صحیح و بیتی.

نمونه ای از کاربرد فناوری

کرارک

سخت ترین قسمت این برنامه تنتور است. این برنامه دارای یک رابط کنسول است، اما به لطف دستورالعمل هایی که با خود برنامه ارائه می شود، می توان از آن استفاده کرد. زیر است آموزش کوتاهبرای تنظیم برنامه ما برنامه را از نظر عملکرد آزمایش می کنیم و آن را با برنامه مشابه دیگری که از NVIDIA CUDA استفاده نمی کند، مقایسه می کنیم، در این مورد برنامه معروف "Advanced Archive Password Recovery" است.

از بایگانی دانلود شده cRark، ما فقط به سه فایل نیاز داریم: crark.exe، crark-hp.exe و password.def. Сrark.exe یک رمز عبور RAR 3.0 بدون فایل های رمزگذاری شده در بایگانی است (یعنی با باز کردن بایگانی، نام ها را می بینیم، اما نمی توانیم بایگانی را بدون رمز عبور باز کنیم).

Сrark-hp.exe یک ابزار خط فرمان برای شکستن رمز عبور RAR 3.0 است که کل بایگانی را رمزگذاری می کند (یعنی هنگام باز کردن یک بایگانی، نه نام و نه خود بایگانی ها را نمی بینیم، و نمی توانیم بایگانی را بدون استفاده از بسته بندی باز کنیم. کلمه عبور).

Password.def هر فایل متنی تغییر نام یافته با محتوای بسیار کمی است (به عنوان مثال: خط اول: ## خط دوم: ?*، در این صورت رمز عبور با استفاده از همه کاراکترها شکسته می شود). Password.def سر برنامه cRark است. این فایل حاوی قوانین باز کردن رمز عبور (یا ناحیه کاراکتری است که crark.exe در کار خود استفاده می کند). جزئیات بیشتر در مورد گزینه های انتخاب این کاراکترها در فایل متنی به دست آمده با باز کردن فایل دانلود شده از سایت از نویسنده برنامه cRark نوشته شده است: russian.def.

آموزش

فوراً باید بگویم که این برنامه فقط در صورتی کار می کند که کارت گرافیک شما مبتنی بر GPU با پشتیبانی از سطح شتاب CUDA 1.1 باشد. بنابراین، یک سری از کارت‌های ویدیویی مبتنی بر تراشه G80، مانند GeForce 8800 GTX، قابل بحث نیست، زیرا از پشتیبانی سخت‌افزاری برای شتاب CUDA 1.0 برخوردار هستند. با استفاده از CUDA، برنامه فقط رمزهای عبور را برای آرشیوهای RAR نسخه های 3.0+ انتخاب می کند. تمام نرم افزارهای مرتبط با CUDA باید نصب شوند، یعنی:

ما هر پوشه ای را در هر جایی ایجاد می کنیم (مثلاً در درایو C:) و آن را با هر نامی صدا می زنیم، مثلاً "3.2". ما فایل ها را در آنجا قرار می دهیم: crark.exe، crark-hp.exe و password.def و یک آرشیو RAR محافظت شده با رمز عبور / رمزگذاری شده.

در مرحله بعد، باید کنسول خط فرمان ویندوز را راه اندازی کنید و به پوشه ایجاد شده در آن بروید. در ویندوز ویستا و 7 باید منوی Start را فراخوانی کنید و در قسمت جستجو عبارت cmd.exe را وارد کنید؛ در ویندوز XP از منوی Start ابتدا پنجره Run را فراخوانی کرده و cmd را وارد کنید. exe" در آن است. پس از باز کردن کنسول، دستوری مانند: cd C:\folder\ , cd C:\3.2 را در این مورد وارد کنید.

استخدام در ویرایشگر متندو خط (همچنین می توانید متن را به عنوان یک فایل bat. در پوشه با cRark ذخیره کنید) تا رمز عبور یک آرشیو RAR محافظت شده با رمز عبور با فایل های رمزگذاری نشده را حدس بزنید:

پژواک خاموش؛
cmd /K کرک (نام آرشیو).rar

برای حدس زدن رمز عبور یک آرشیو RAR محافظت شده و رمزگذاری شده با رمز عبور:

پژواک خاموش؛
cmd /K crark-hp (نام آرشیو).rar

2 خط را کپی کنید فایل متنیوارد کنسول شوید و Enter را فشار دهید (یا فایل bat. را اجرا کنید).

نتایج

فرآیند رمزگشایی در شکل نشان داده شده است:

سرعت انتخاب در cRark با استفاده از CUDA 1625 رمز عبور در ثانیه بود. در یک دقیقه، سی و شش ثانیه، یک رمز عبور با 3 کاراکتر حدس زده شد: "q)$". برای مقایسه: نرخ brute force در Advanced Archive Password Recovery در پردازنده دو هسته ای Athlon 3000+ من حداکثر 50 کلمه عبور در ثانیه است و brute force 5 ساعت طول می کشد. یعنی انتخاب آرشیو RAR توسط bruteforce در cRark با استفاده از کارت گرافیک GeForce 9800 GTX+ 30 برابر سریعتر از CPU است.

برای کسانی که پردازنده اینتل، مادربرد خوب با فرکانس گذرگاه سیستم بالا (FSB 1600 مگاهرتز) دارند، نرخ CPU و brute force بالاتر خواهد بود. و اگر یک پردازنده چهار هسته ای و یک جفت کارت گرافیک در سطح GeForce 280 GTX دارید، در این صورت عملکرد brute force پسورد گاهی تسریع می شود. در جمع بندی مثال باید گفت که این مشکل با استفاده از فناوری CUDA به جای 5 ساعت تنها در 2 دقیقه حل شد که نشان از پتانسیل بالایی برای این فناوری دارد!

نتیجه گیری

امروزه با در نظر گرفتن فناوری محاسبات موازی CUDA، به وضوح تمام قدرت و پتانسیل عظیم برای توسعه این فناوری را با استفاده از مثال برنامه بازیابی رمز عبور مشاهده کردیم. آرشیوهای RAR. در مورد چشم انداز این فناوری باید بگویم، این تکنولوژیمطمئناً در زندگی هر فردی که تصمیم به استفاده از آن می‌گیرد، چه کارهای علمی باشد، چه کارهای مربوط به پردازش ویدیو، یا حتی کارهای اقتصادی که نیاز به محاسبه دقیق سریع دارند، جایی پیدا می‌کند، همه اینها منجر به افزایش اجتناب‌ناپذیر نیروی کار خواهد شد. بهره وری که نمی توان نادیده گرفت. تا به امروز، عبارت "ابر رایانه خانگی" در حال ورود به فرهنگ لغت است. کاملاً بدیهی است که برای تبدیل چنین شیئی به واقعیت، هر خانه از قبل ابزاری به نام CUDA دارد. از زمان انتشار کارت های مبتنی بر تراشه G80 (2006)، مقدار زیادیشتاب دهنده های مبتنی بر NVIDIA که از فناوری CUDA پشتیبانی می کنند، که می توانند رویای ابر رایانه در هر خانه را به واقعیت تبدیل کنند. با ترویج فناوری CUDA، NVIDIA اعتبار خود را در نظر مشتریان به شکل ارائه ویژگی های اضافی برای تجهیزات خود که بسیاری قبلاً خریداری کرده اند، افزایش می دهد. فقط باید باور داشت که به زودی CUDA بسیار سریع توسعه خواهد یافت و به کاربران اجازه می دهد تا از تمام امکانات محاسبات موازی در GPU استفاده کامل کنند.