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