اکثر پردازندههای امروزی از آنهایی که در کامپیوترهای شخصی مورد استفاده قرار میگیرند تا پردازندهی گوشیهای هوشمند بیش از یک هسته دارند. اما هسته در پردازندهها به چه معنی است و تعداد هستههای بیشتر در یک پردازنده چه تاثیری در کارایی سیستم دارد؟
پردازنده ۲هستهای، ۴هستهای، ۶هستهای یا حتی پردازنده با هستههای بیشتر در بازار یافت میشوند. در بسیاری از کامپیوترها و حتی ابزارهای موبایل، تعداد هستههای بیشتر، به یک عامل مهم در فروش محصولات تبدیل شده است و کاربران ترجیح میدهند تا دستگاهی را تهیه کنند که به پردازنده با هستههای بیشتر مجهز شده باشد. در نگاه کلی، تعداد هستههای بیشتر به معنی قدرت پردازش بالاتر است. هرچند این عبارت همیشه صادق نیست، اما در معماری و طراحی یکسان، هر چه تعداد هستهها افزایش یابد، قدرت پردازشِ پردازنده بیشتر میشود.
پردازندهی مرکزی یا CPU وظیفهی محاسبهی دستورات را برعهده دارد. هر CPU میتواند بهصورت همزمان یک تسک یا کار را پردازش کند. در قدیم کامپیوترهایی که نیاز به قدرت پردازش بالاتر داشتند از چند CPU بر روی یک مادربرد بهره میبرند. در این حالت، مصرف انرژی افزایش مییافت و ارتباط بین CPUها با تاخیر قابل ملاحظهای انجام میشد. همچنین برای آنکه پردازندههای مختلف بتوانند به حافظهی رم و دیگر اجزاء سختافزاری بهصورت مشترک دسترسی داشته باشند، به قطعات بیشتر از آنچه در مادربردهای معمولی استفاده میشد، نیاز خواهیم داشت که خود باعث افزایش هزینه مادربردها میشد.
در همین راستا تولیدکنندگان پردازنده به فکر ساخت CPUهایی افتادند که به چند هسته مجهز باشند تا هر کدام بتوانند نقش یک CPU مستقل را ایفا کرده و یک تسک را پردازش کنند. بهعنوان مثال تصور کنید که قرار است عملیات ریاضی زیر توسط یک پردازندهی تک هسته محاسبه شود:
۲x20x60x187
در این حالت پردازنده ابتدا ۲ را در ۲۰ ضرب کرده و سپس حاصل را در ۶۰ ضرب کرده و نتیجه را در ۱۸۷ ضرب میکند.
۲x20
۴۰x60
۲۴۰۰x187
اما یک پردازندهی دو هستهای میتواند دو عملیات اول را همزمان پردازش کرده و سپس عملیات سوم را پردازش کند. این کار که Parallelization یا پردازش موازی نامگذاری شده، باعث میشود تا سرعت اجرای دستورات بیشتر شود.
حالا در نظر بگیرید که برنامههای پیچیده بتوانند دستورات بسیار زیاد خود را بین چند هسته تقسیم کرده و همزمان به پردازش آنها بپردازد. نرمافزارهایی مانند ویراستارهای ویدیو، فشردهسازهای فایل یا حتی آنهایی که عملیات رمزگشایی را انجام میدهند جزو مواردی هستند که استفاده از پردازش موازی در سرعت اجرای دستورات آنها بسیار تأثیر گذار است.
چرا تعداد هستههای CPU به اندازهی GPU نیست؟
حال این سوال مطرح میشود که اگر پردازش موازی باعث افزایش سرعت میشود چرا CPUها مثل GPUها از چندین هسته بهره نمیبرند؟ GPUها نیز وظیفهی پردازش امور را برعهده دارند اما این پردازندهها از چندین هسته بهره میبرند. بهعنوان مثال کارت گرافیک قدرتمند GeForce 1080 انویدیا از ۲۵۶۰ هسته بهره میبرد این در حالی است که CPU کامپیوترهای دسکتاپ حداکثر ۱۰ هسته دارند.
هرچند GPUها تعداد هستههای به مراتب بیشتری نسبت به CPUها دارند، اما این هستهها، بسیار ضعیفتر بوده و با فرکانس پایینتری کار میکنند. پاسخ کوتاه به این پرسش این است که GPU یا پردازنده گرافیکی همانطور که از نامش پیدا است برای پردازش امور مرتبط با گرافیک مانند رندر تصاویر بازیها یا نرمافزارهای سهبعدی یا ادیت ویدیو بهکار میروند. اما در عوض CPU قادر به انجام پردازشهای مختلف برای امور گوناگون است. اموری که برای پردازش به GPU سپرده میشوند، عموما امکان خرد کردن آنها و پردازش موازی گستردهشان وجود دارد. حتی در بازیها نیز بعضی از امور مانند هوش مصنوعی توسط CPU پردازش میشود چرا که هستههای ضعیف GPU قادر به پردازش تسکهای بزرگ و پیچیدهی مربوط به هوش مصنوعی نیستند و از طرفی خرد کردن این دستورات در چندین تسک کوچک نیز کار دشواری است.
پس پردازندههای گرافیکی برای انجام امور مرتبط با تصویر و گرافیک طراحی شدهاند و این دست از امور به شکل سادهتری قادر به خرد شدن و پردازش موازی بین هستههای زیاد هستند اما در عوض CPU برای پردازش طیف وسیعتری از امور طراحی شده است و در عوض دستورات پردازش شده توسط CPU سختتر خرد میشوند. برای درک بهتر این موضوع ویدیو کوتاه انویدیا در این باره را تماشا کنید:
فناوری Hyper Threading
این فناوری که توسط اینتل توسعه داده شده امکان اجرای تسکهای همزمان بیشتر در پردازنده را میسر میکند. هایپر-تردینگ اولین بار در سال ۲۰۰۲ و به همراه Pentium 4 HT معرفی شد. پنتیوم ۴ تنها یک هسته داشت و قادر به اجرای همزمان یک دستور بود؛ اما به کمک فناوری هایپر-تردینگ در نسخهی HT این پردازنده، امکان اجرای همزمان دو دستور فراهم شد.
در فناوری هایپر-تردینگ دو یا چند هستهی منطقی به ازاء هر هستهی فیزیکی ایجاد میشود و رفتار سیستمعامل با این هستههای منطقی درست مثل هستههای فیزیکی است. به این ترتیب تسکها بهصورت موازی پردازش شده و پردازنده با توان بیشتر شروع به پردازش امور میکند. در واقع پردازنده، به نوعی سیستمعامل را فریب و به کمک مکانیزم خاصی پردازش موازی را در هر هسته شکل میدهد. در این حالت منابع پردازنده به دو بخش تقسیم میشوند. اگر یکی از هستههای مجازی پردازش تسک موردنظر خود را به پایان برساند و به حالت انتظار برود، منابع در دسترس آن به پردازش سریعتر تسک موازی آن به هستهی مجازی دیگر قرض داده میشود. در اکثر شرایط فناوری هایپر-تردینگ به خوبی شرایطی که پردازنده دو برابر هسته داشته باشد کار میکند.
پردازندههای جدید امروزی نه تنها از چند هسته بهره میبرند بلکه فناوری Hyper-Threading را نیز دارند. در این حالت مثلا پردازندهی دو هستهای با فناوری هایپر-تردینگ همچون پردازندهی ۴ هستهای در سیستمعامل شناخته میشود.
پردازندههای چند هستهای
پردازندههای اولیه تنها یک هسته داشتند. این بدین معنی است که هر پردازنده تنها یک واحد پردازش مرکزی داشت. برای افزایش بازده و قدرت پردازنده، تولیدکنندگان به فکر افزایش هستهها در CPU افتادند. در همین راستا پردازندههای دو هستهای تولید شدند که در واقع دو واحد پردازش مرکزی داشتند و سیستمعاملها نیز آنها را دو پردازنده مستقل میدیدند و تسکها را بهصورت موازی به آنها ارسال میکردند.
برخلاف فناوری هاپیر-تردینگ در این حالت دو هستهی فیزیکی وجود دارد که همچون دو CPU مستقل عمل میکنند با این تفاوت که هر دو CPU در دل یک تراشه قرار دارند. نزدیک شدن هستهها به یکدیگر ارتباط بین آنها را سریعتر کرده و دسترسی آنها به المانهای دیگر پردازنده مانند حافظههای کش و غیره را تسریع میکند.
امروزه پردازندههای ۴هستهای، ۸هستهای، ۱۶هستهای یا حتی ۲۲هستهای نیز وجود دارد و اکثر آنها نیز از فناوری هایپر-تردینگ یا فناوری مشابه آن پشتیبانی میکنند که باعث میشود تعداد هستههای منطقی و فیزیکی آنها به ۸، ۱۶ یا ۳۲ یا ۴۴ هسته افزایش یابد. مزیت اصلی افزایش هستهها در یک پردازنده آن است که نیازی به استفاده از ۴ یا ۸ سوکت در یک مادربرد نیست و همچنین ارتباط بین هستهها به مراتب بهینهتر انجام میشود.
تولیدکنندگان عموما هستههای پردازنده را در یک IC مجتمع میکنند و از این چیپ بهعنوان مالتیپراسسور یا CMP یاد میشود. پردازندهی چندهستهای میتواند بسته به معماری آن به شکل متفاوتی به منابع پردازنده دسترسی داشته باشند. بهعنوان مثال در بعضی از معماریها هر کدام از هستهها حافظهی کش خود را دارند و برخی نیز از حافظهی کش مشترک بهره میبرند. برخی از آنها روشهای متفاوتی برای ارتباط بین هستهها و ارسال پیام به یکدیگر دارند و نحوهی دسترسی آنها به حافظهی رم نیز متفاوت است. شبکه با توپولوژیهای متفاوتی نیز برای ارتباط بین هستهها مانند باس، رینگ و غیره بهکار گرفته میشود.
هستهها در پردازندههای چندهستهای میتوانند همگن یا ناهمگن باشند. در پردازندههای همگن تمام هستهها دقیقا یکسان هستند. اما در پردازندههای چن هستهای با هستههای ناهمگن، ممکن است هستههای متفاوتی داشته باشند. مثلا در معماری big.LITTLE که توسط آرم توسعه داده میشود دو جفت هسته با معماری کاملا متفاوت استفاده میشود.
در نظر داشته باشید که بازده حاصل از پردازش چندهستهای به الگوریتمهای نرمافزاری، نحوهی خرد کردن دستورات و موازیسازی بستگی دارد. بهطور مشخص بسیاری از اپلیکیشنهای فعلی قادر به موازیسازی دستورات نیستند و نمیتوانند آنها را به دستورات کوچکتر خرد کرده و از تمام هستهها بهره ببرند. بهعنوان مثال برخی از بازیها نمیتوانند بخشهایی که توسط CPU پردازش میشود را بهصورت موازی پردازش کنند. دلیل این موضوع نیز آن است که برخی از دستورات باید پشت سر هم و پس از پردازش بخش اول انجام شوند و همچنین بعضی نیز در شرایط خاصی شکل میگیرند مانند پاسخی که هوش مصنوعی در اثر انجام کار غیرمنتظره از سمت گیمر باید انجام دهد.
با این حال برخی از تولیدکنندگان بازیهای ویدیویی مانند Remedy, Valve, Epic Games و یوبیسافت، از موتورهایی برای تولید بازیهای خود استفاده میکنند که از پردازش موازی پشتیبانی میکنند و البته هنوز هم بخشهایی از برنامه تنها فقط از طریق یک هسته پردازش میشوند.
اما اگر نرمافزاری به خوبی از پس موازیسازی برآید، عملکرد آن به میزان تعداد هستهها قابل افزایش است.
چرا بسیاری از نرمافزارها از پردازش موازی پشتیبانی نمیکنند؟
اگر به بخش Task Manager سیستمعامل خود مراجعه کنید متوجه میشوید که بسیاری از نرمافزارها تنها از توان یکی از هستهها استفاده میکنند و در اکثر شرایط باقی هستهها بلامصرف هستند. اگر نرمافزارها نمیتوانند از توان پردازندهها استفاده کنند، چرا خود پردازنده یا سیستمعامل دستورات مربوط به آنها را خرد نکرده و به پردازنده ارسال نمیکنند؟ متاسفانه راهی وجود ندارد که نرمافزارها را جوری تغییر داد که بتوانند از چند هسته استفاده کنند. دلیل این موضوع نیز در آن است که تنها سازندهی نرمافزار و شخصی که کدهای مربوط به آن را نوشته میتواند دستورات مربوط به آن را جوری تغییر دهد که دستورات خرد شده و بین هستهها تقسیم شوند در غیر اینصورت اگر دستورات خرد شوند ممکن است تقدم و تاخر اجرای آنها بهم خورده و برنامه درست کار نکند.
شاید برخی بر این باور باشند که اگر دو هسته بر روی یک دستور کار کنند سرعت اجرای آن افزایش یابد؛ اما چنین موضوعی امکانپذیر نیست برای درک بهتر موضوع تصور کنید که یک شخص قرار باشد با دو ماشین از یک مکان به مکان دیگر منتقل شود، شخص باید یکی از خودروها را برای انتقال خود انتخاب کند و حتی اگر هر دو هسته به سمت مقصد حرکت کنند باز هم شخص در یک زمان مشخص به مقصد میرسد و وجود دو خودرو نمیتواند وی را زودتر به نتیجه برساند.
پس در نهایت با ارائهی پردازندههای چندهستهای قدرت آنها به شدت افزایش یافته و سرعت کامپیوترها زیاد میشود. اما اگر نرمافزارها برای پردازش موازی دستوارت طراحی نشده باشند، قدرت و بازده پردازندهی تکهستهای با همان معماری اما هستههای بیشتر چندان متفاوت نیست. تقریبا تمام سیستمعاملها از ویندوز تا مک تا توزیعهای لینوکس همگی از پردازش موازی پشتیبانی میکنند. بسیاری از اپلیکیشنهای بزرگ مانند محصولات ادوبی، نرمافزارهای ویرایش تصاویر یا ویدیو، نرمافزارهای فشردهسازی، اپلیکیشنهای رمزگشایی یا فشردهسازی، نرمافزارهای مهم سرورها و همچنین برخی از بازیهای مجهز به موتورهای پیشرفته قادر به استفاده از توان چندهسته در پردازنده هستند. اما عموم اپلیکیشنهای موبایل و نرمافزارهای سادهی تحت سیستمعاملهای دسکتاپ قادر به موازیسازی نیستند. فرآیند موازیسازی نرمافزارها بحث بسیار پیچیدهای است که پیادهسازی آن توسط عموم توسعهدهندگان نرمافزاری دشوار است و اغلب از آن صرفنظر میکنند.