G P U
هنگامی که چند ماه پیش جدال لفظی مدیران اینتل و Nvidia خبر داغ رسانهها شد، چندان خبر نداشتم که منشأ این تقابل چیست. چرا مدیران دو شرکت که ظاهراً بازارهای هدف متفاوتی دارند، باید با هم به نزاع بپردازند؟
درست است که در بهترین کامپیوترهای رومیزی بازار، پردازنده مرکزی ساخت اینتل در چند سانتیمتری پردازنده گرافیکی ساخت Nvidia جا خوش کرده، اما بعید بهنظر ميرسيد که این دو نوع پردازنده بسیار متفاوت، بتوانند یا بخواهند حتی در همان فاصله نزدیک در کار هم سرک بکشند. ماجرا چیست؟
در نبردی مشابه، AMD بازیگر دیگر این عرصه یعنی ATI را بلعید. هدف درازمدت AMD ظاهراً یکیکردن پردازندههای گرافیکی و مرکزی است. آیا توان پردازشی این دو نوع پردازنده با هم قابل قیاس است؟
جدا از این که قدرت پردازشی پردازندههای گرافیکی در مقایسه با پردازندههای مرکزی چقدر است، دشواری اصلی در شیوه برنامهنویسی برای استفاده از این توان بودهاست. تا سه سال پیش اگر هوس استفاده از جیپییو برای پردازش غیرگرافیکی به سر کسی میزد، کمتر ابزاری برای برنامهنویسی مستقیم وجود داشت.
بیشتر تلاشهای انجامشده در این راه، در واقع به شکنجه شبيه بودند؛ باید وظایف پردازشی موردنظر را در قالب ابزارهایی مانند DirectX یا OpenGL به شکل اشکال هندسی به پردازنده گرافیکی تفهیم میکردید. پردازنده گرافیکی جواب محاسبات را برای شما «رسم میکرد» و دیگر به عهده خودتان بود که دوباره آن را به شکل مناسب ترجمه کنید.
چرا؟ زيرا پردازنده گرافیکی برای چنین کاری ساخته شده است. توسعه دادن ابزارهای برنامهنویسی جیپییو برای پردازشهای غیرگرافیکی فقط در یک صورت توجیهپذیر بود: این که توان محاسباتی بزرگی، دستکم قابل مقایسه با توان پردازشگر مرکزی، در پردازندههای گرافیکی وجود داشتهباشد. آیا چنین توانی وجود دارد؟ پاسخ این پرسش به طور کلی مثبت است، اما محدودیتهایی هم وجود دارند.
بیایید اول به نوع محدودیتها نگاهی بیاندازیم و بعد سراغ خبرهای خوب برویم. معماری پردازندههای مرکزی و گرافیکی با هم متفاوت است و این تفاوت طبعاً به هدفی که در طراحی آنها وجود داشته باز میگردد. پردازندههای مرکزی امروزی در پردازش وظایف محاسباتیای که استفاده زیادی از کَش سیستم ميکنند، قویتر از پردازندههای گرافیکی هستند و تمرکز کاری آنها بر پردازش بهینه هر رشته (thread) به شکل مجزا است.
در مقابل، پردازندههای گرافیکی به گونهای طراحی شدهاند که وظایفی که از ALU (واحد محاسبات و منطق) زیاد استفاده میکنند، بهتر پردازش میکنند. معماری درونی آنها شدیداً به پردازش موازی و بازدهی کلی (به جای بازدهی تکرشتهها) معطوف است. آیا این مسئله شما را به یاد پردازندههای چندهستهای متداول امروزی نمیاندازد؟
ظاهراً دنیای پردازش گرافیکی به دلیل نیازهای ویژه خود خیلی زودتر و جدیتر از جهان CPUها به دنبال پردازش موازی رفته و شگفت نیست که ببینیم در این زمینه بسیار جلوتر از آنها است. در حالی که سازندگان پردازندههای مرکزی اعتبار قانون مور را به زور و ضرب حفظ کردهاند، در چند سال اخیر، در دستیابی به توان پردازشی بالاتر چندان پیشرفتی نداشتهاند.
شاید بتوان گفت دو سازنده عمده پردازندههای مرکزی (اینتل و AMD) خیلی دیر به فکر استفاده از پردازندههای چندهستهای افتادند و پیشرفت آنها در این زمینه هم چندان سریع نیست. شرکت سان ایدههای بلندپروازانهای در افزایش تعداد هستهها داشت که باید ببینیم آن ایدهها با هضم شدن در پیکر اوراکل چه سرانجامی مییابند.
در شکل ۱، نموداری از قله توان محاسبات اعشاری ساده (Single Precision) را برای نسلهای اخیر پردازندههای اینتل در مقایسه با نسلهای اخیر پردازندههای گرافیکی Nvidia میبینید. توجه داشتهباشید که چنین نمودارهایی را برای پردازندههای رومیزی کمتر میتوان یافت، زيرا تمرکز سازندگان این قطعهها بر نوع عملکردی است که از یک نسل به نسل بعدی بهبود زیادی یافتهباشد و معمولاً قدرت پردازش بر حسب معیار دقیق آن که تعداد محاسبات اعشاری در واحد زمان است، بیان نمیشود. 
در این نمودار میتوان دید که رشد توان محاسباتی پردازندههای اینتل با فاصلهای فزاینده از توان محاسباتی GPUهای Nvidia عقب ماندهاست. این مسئله تصادفی نیست. اگر کامپیوتر رومیزی شما یکی از پردازندههای جدید اینتل و یکی از کارتهای گرافیکی جدید Nvidia را درون خود جای دادهباشد، پردازنده مرکزی آن فقط چهارهسته دارد، در حالی که پردازنده گرافیکی آن ممکن است ۲۴۰ هسته داشتهباشد و این تازه بدون استفاده از فناوري SLI برای استفاده موازی از دو کارت گرافیکی است.
از حدود دو سال پیش، Nvidia مجموعهای از ابزارهای برنامهنویسی را در قالب مجموعهای به نام CUDA (سرنام Compute Unified Device Architecture) به رایگان ارائه کرد که برنامهنویسان را قادر میسازد بهطور مستقیم برای GPU به زبان C کدهای پردازش موازی بنویسند. البته CUDA فقط یک مجموعه نرمافزاری نیست، بلکه یک واسط سختافزاری هم در کارتهای گرافیکی سری GT80 به بعد Nvidia تعبیه شده که برای دریافت و اجرای برنامههای نوشتهشده با CUDA لازم است.
CUDA از توان پردازشی CPU و GPU بهطور همزمان استفاده میکند. در بازنویسی و کامپایل دوباره برنامهها برای استفاده همزمان از پردازندههای گرافیکی و مرکزی، افزایش سرعتی به میزان ده تا سي برابر به طور معمول مشاهده میشود و با بهینهسازی کدهای متمرکز بر محاسبات اعشاری، میتوان به سرعت صد برابر یا بیشتر (در مقایسه با حالتی که فقط از یک پردازنده مرکزی استفاده شود) دست یافت. اگر فکر میکنید در این اعداد یک صفر اضافه است، بدانید که بسیاری دیگر هم دچار همین پندار و شگفتی شدهاند.
اگر موضوع برای شما هم مانند من جالب باشد، همین اشاره کوتاه احتمالاً کافی است. شگفتی و هیجان بیشتری هم در راه است.