در هفته جاری شاهد معرفی پردازندهی بسیار کم مصرف با ۱۰۰۰ هستهی پردازشی بودیم. اما پردازندهی ۱۰۰۰ هستهای در چه زمینهای استفاده میشود و به چه دلیل باید تعداد زیادی هسته برای پردازنده داشته باشیم؟ با نتکو باشید.
قانون مور که بیان میکرد تعداد ترانزیستورها در پردازندهها هر دو سال دو برابر میشود، چندان پایدار نبوده و تولیدکنندگان قادر نشدند که در مساحت یکسان، پردازندههایی با دو برابر ترانزیستور بیشتر نسبت به ۲ سال قبل تولید کنند، حتی اگر این امکان وجود داشته باشد، افزایش ترانزیستورها به این معنی که افزایش دو برابری سرعت اجرای اپلیکیشنها نخواهد بود. در این راستا برنامهنویسی معروفی به نام هرب ساتر، در یک مقالهی مفصل در سال ۲۰۰۴ پیشبینی نمود که افزایش سرعت کلاک CPUها به حداکثر رسیده است و افزایش فرکانس نیز نمیتواند چندان در افزایش سرعت اجرای اپلیکیشنها، موثر واقع گردد.
در عوض در دنیای GPUها یا پردازندههای گرافیکی، ترانزیستورها به جای اینکه تعداد محدودی هسته را تشکیل دهند، چندین هسته را تشکیل میدهند و پردازش موازی این هستهها باعث شاهد رشد چشمگیر نسلهای مختلف کارتهای گرافیک نسبت به نسلهای قبلی باشیم. به عنوان مثال در کارت گرافیک جدیدِ GeForce GTX 1080 از انویدیا شاهد بکارگیری ۲۵۶۰ هسته می باشیم که با فرکانس ۱۶۰۰ تا ۱۷۰۰ مگاهرتز کار میکنند. برنامه نویسها و developerها نیز نرمافزارهایی ساختهاند که به بخشهای کوچک تقسیم میشود تا توسط این GPUها پردازش شود. بازیها یا نرمافزارهای علمی از این دسته هستند که عموما پردازش مربوط به آنها توسط GPU انجام میشود.
اما در دنیای امروزی، اکثر نرمافزارها تنها با یک Thread اجرا میشوند و به همین دلیل است که تغییری در سرعت اجرای آنها با یک پردازندهی ۴ هستهای و همان پردازنده با یک هسته وجود ندارد. قسمتی از این مشکل به دلیل ضعف نرمافزارها است که جوری برنامه نویسی نشدهاند که از تمام توان پردازندهها و هستهها استفاده کنند. از طرفی برخی از دستورات نیز آنقدر پیچیده هستند که به راحتی نمیتوان آنها را به چندین بخش کوچک تبدیل کرد.
تبدیل ترانزیستورهای بیشتر به نرمافزارهای سریعتر، روز به روز سخت و دشوار میشود
با این حال، به احتمال زیاد در آینده، پردازندهها به هستههای ضعیفتر اما بسیار بیشتر مجهز خواهند شد؛ چرا که سرعت پردازشِ پردازندهها با روش فعلی به کندی افزایش مییابد و چارهای جز اضافه کردن تعداد هستهها نیست. به همین دلیل است که خبر ساخت پردازندهی ۱۰۰۰ هستهای مهم و خبرساز میشود.
معماری تراشهها به نوعی عجیب و بسیار پیچیده است و اگر تعداد هستهها را در پردازندهها افزایش دهیم شاید مجبور شویم که کل ساختار کامپیوترها را تغییر دهیم. در پردازندهها، هر کدام از هستهها تقریبا فضای مستقل و جداگانهی خود را دارند و هستهها از طریق شبکهی داخلی خود با یکدیگر ارتباط ساختاری برقرار میکنند. به همین دلیل است که کار برنامهنویسها برای استفاده از تمام توان هستهها دشوار میشود. در همین راستا ایدههای مختلفی مطرح شده است که شاید جذابترین آنها معماری KiloCore است که بکار گیری از ۶۴ هسته در پردازنده را سادهتر میکند. مهمترین برگ برندهی کیلوکور در مصرف بهینهی انرژی است. تیم UC Davis بیان می کند که کیلوکور تا ۱۰۰ برابر مصرف بهینهتری از پردازندهی لپتاپهای مورد استفاده شده در حال حاضر را دارد. یک پردازنده با این معماری حتی با یک باتری قلمی نیز کار میکند.
در نتیجه برای آنکه شاهد پردازندههای قویتر، سریعتر و کممصرفتری باشیم احتمالا باید بدنبال طراحی CPUهای شبیه به GPU با هستههای زیاد باشیم. پردازندههایی که تعداد هستهی زیاد با فرکانس پایینتر دارند و قادر به پردازش موازی تعداد زیادی عملیات کوچک هستند. اما برای رسیدن به کامپیوترهای سازگار به این نوع پردازندهها، راه پر و پیچ و خم و دشواری پیشِ رو است و باید تولیدکنندگان سختافزار و نرمافزار عزم خود را جزم نمایند.
اگر بخواهیم بصورت سطحی مسئله را بررسی کنیم، معماری CPU سرور تفاوت چندانی با معماری CPU ها PC ها معمولی ندارد. بیشتر سرورهایی که در طی سالهای اخیر تولید شده اند از امکان پردازشگرهای چند هسته ای یا Multicore Processors استفاده کرده اند. یک پردازنده چند هسته ای در واقع یک CPU است که دارای دو یا بیش از دو عدد پردازنده یا بهتر بگوییم هسته پردازشی که در داخل یک چیپ الکترونیکی قرار گرفته اند می باشد. البته استفاده از پردازنده های چند هسته ای این روزها در PC های معمولی هم رواج پیدا کرده است اما دقت کنید که PC ها محدود به استفاده از یک CPU فیزیکی هستند. از طرفی سرورها به گونه ای طراحی شده اند که حداقل از دو و یا بیشتر از دو عدد CPU فیزیکی را پشتیبانی کنند. به تعداد CPU های فیزیکی که هر سرور می تواند با همدیگر تظبیق بدهد معمولا به عنوان تعداد Socket هایی که سرور دارد عنوان می شود.
گسترش روز به روز فناوری های مجازی سازی باعث شده است تا مدیران شبکه مجبور شوند به تعداد هسته های موجود بر روی CPU ها سرورهایی که در نقش میزبان یا HOST در ساختارهای مجازی سازی استفاده می شوند بیشتر توجه کنند. هر چند که هسته های CPU بصورت مستقیم و مشخص به ماشین های مجازی اختصاص داده نمی شود اما تعداد هسته های موجود بر روی سرور فیزیکی تاثیر مستقیمی بر روی کارایی و عملکرد ماشین های مجازی دارد که بر روی سرور HOST قرار می گیرند. در یک جمله می توان گفت هر چه تعداد هسته های CPU یک سرور بیشتر باشد، سرور پتانسیل میزبانی تعداد ماشین مجازی بیشتری را خواهد داشت. چرا می گوییم پتانسیل؟ به دلیل اینکه فاکتورهای زیادی برای تخمین تعداد ماشین های مجازی قابل ایجاد بر روی سرور به غیر از بحث CPU وجود دارد، مثلا یکی از محدودیت ها یا فاکتورهای دیگر در تعداد ماشین های مجازی میزان حافظه RAM فیزیکی موجود بر روی سرور است.
شما می توانید با ضرب تعداد CPU های فیزیکی سرور در تعداد هسته های موجود بر روی هر کدام از CPU ها به تعداد هسته های موجود بر روی کل سرور دست بیابید. دقت کنید که گفتیم تعداد CPU های فیزیکی نه تعداد Socket های فیزیکی، موارد بسیاری وجود دارد که شما در سرور خود Socket های خالی دارید. بیشتر تولید کنندگان سرور در دنیا ممکن است Socket های خالی بر روی بورد سرورهای خود تعبیه کنند تا در صورت نیاز به بروز رسانی سرور بتوانند از این Socket ها برای اضافه کردن CPU استفاده کنند و البته طبیعی است که با نبود CPU قیمت آن سرور هم نسبت به سروری که دارای CPU به جای Socket خالی می باشد بیشتر خواهد بود. خوب این یک نکته جالب را نشان می دهد، سیستم سرور معمولا می تواند انتخاب های متنوعی را در اختیار مدیر سیستم قرار دهد. مثلا من سرورهایی را دیده ام که بر روی برد آنها قابلیت نصل 4 یا 5 عدد CPU فیزیکی وجود داشت که هر کدام از CPU هایی که بر روی این Socket ها می توانستند قرار بگیرند توانایی پشتیبانی از چندین هسته را داشتند که هر کدام می تواند انتخاب متنوعی را در اختیار مدیران سیستم قرار دهد، از جمله اینکه شما براحتی می توانید با استفاده از قابلیت Over Clocking کارایی سیستم را به خوبی زیاد کنید.
در حالت معمول هر پردازنده ای که بتواند clock speed یا سرعت ساعت بیشتری داشته باشد دارای کارایی بیشتری نیز می باشد. البته این مسئله در کنار ثابت بودن معماری CPU انجام می شود و در معماری آن تغییری حاصل نمی شود. شما همیشه نمی توانید سرعت CPU را بر اساس Clock Speed آن تعیین کنید. برخی از CPU ها از مشابه های دیگر آن بهتر هستند هر چند که Clock Speed آنها نسبت به دیگر CPU های مشابه کمتر است اما خروجی بهتری در پردازش ها ارائه می دهند. در واقع معیار اصلی تعداد پردازش ها یا بهتر بگوییم تعداد دستوراتی است که هر CPU قادر است در هر ثانیه پردازش کند. Clock Speed میتواند تعداد این دستورات را که در ثانیه انجام می شود را محدود کند و اجازه استفاده بیشتر از قابلیت های CPU را به سیستم ندهد. اکثر CPU ها امروزی قادر به اجرای چندین دستورالعمل در هر دوره زمانی Clock Cycle هستند.
نکته مهم دیگری که در خصوص معماری CPU بایستی بدانید این است که با اضافه کردن قدرت پردازشی بیشتر به سرور لزوما کارایی سرور بالا نخواهد رفت. برای اینکه درک بهتری از این موضوع داشته باشید برای لحظه ای مبحث مجازی سازی در سرورها را فراموش کنید. مجازی سازی کارهای را کمی پیچیده می کند و چون این سری مقاله برای دوستانی نوشته شده است که به تازگی وارد دنیای فناوری اطلاعات شده اند بهتر است زیاد درگیر این موضوع نشویم و مباحث را ساده دنبال کنیم. خوب با این اوصاف فرض کنید که سروری دارید که دارای دو عدد Socket است اما فقط یک CPU فیزیکی دارد، همچنین فرض کنید که این سرور تنها یک وظیفه کاری را انجام می دهد که مثلا مدیریت یک پایگاه داده و یا چیزی شبیه به آن است. بعد از مدتی که از کارکرد سرور می گذرد شما تصمیمی میگیرید که به سرور پردازنده جدیدی اضافه کنید تا کارایی سرور بالا برود.
خوب بطور منطقی اگر شما به سرور یک پردازنده اضافه کنید قاعدتا سرعت و کارای سرور بایستی دو برابر شود. متاسفانه یه این سادگی های نیست. در اینجاست که سرور کمی دچار مشکل خواهد شد، مشکل اینجاست که سرور بایستی تصمیم بگیرد که هر پردازش را به سمت کدامیک از CPU ها هدایت کند و همین تصمیم گیری برای انجام هر پردازش باعث بالا رفتن بار کاری CPU و سرور خواهد شد. با توجه به چند هسته ای بودن ساختارهای CPU امروزی همین امر می تواند تا 50 درصد کارایی و سرعت CPU را برای تخصیص این وظایف و پردازش ها هدر دهد و این یعنی 50 درصد از قابلیت های CPU جدید مورد استفاده قرار نخواهد گرفت. بنابراین هنگامی که شما یک CPU به سرور خود اضافه می کنید در واقع 50 درصد کارایی سرور را افزایش داده اید و سایر قابلیت های آن استفاده نخواهد شد. امروزه پردازنده های چند هسته ای کارهایی زیادی برای رفع این مشکل و ایجاد روشی کارآمد در مدیریت وظایف سیستم انجام داده اند اما متاسفانه هنوز معیار درست و قابل اعتمادی از طرف سازندگان CPU در جهت اندازه گیری این مقدار از فعالیت سیستم ارائه نشده است و یا حداقل من در مورد آن اطلاعات کافی ندارم.
چند لحظه پیش در خصوص پردازنده های چند هسته ای و همچنین اضافه کردن CPU فیزیکی ثانوی به سرور اشاره ای داشتیم و گفتیم که در حالت ایده آل این پردازنده ثانوی می تواند تا 50 درصد کارایی سرور را بالا ببرد. دلیل اینکه به حالت ایده آل اشاره کردیم این بود که هر سروری قادر به استفاده درست از CPU ها جانبی و ثانوی نبوده و اضافه شدن این تعداد CPU به اینگونه سرورها می تواند آن را دچار مشکل کند. دلیل این مشکل فرآیند threading می باشد. یک Thread یک قسمت مستقل از عملیات اجرایی سیستم است. اگر نرم افزاری به گونه ای برنامه ریزی شده است که صرفا می تواند در CPU بر روی یک Thread اجرا شود، سیستم قادر نخواهد بود این نرم افزار را به Thread های متعدد تقسیم کرده و اجرای آن را به CPU های موجود تقسیم کند. تنها روشی که شما می توانید از مزایای استفاده از چندین CPU بصورت همزمان استفاده کنید این است که نرم افزار شما هم بصورت چند نخی یا Multi Threading طراحی شده باشد. نرم افزارهای Multi Thread این قابلیت را دارند که پردازش های خود را تفکیک کرده و هر کدام را به سمت یکی از CPU های موجود بر روی سیستم ارسال کنند.
معماری CPU
وقتی به سراغ خریداری سخت افزارهای سرور می روید حتما با واژه هایی مثل x86 یا x64 یا Itanium مواجه شده اید که در مورد CPU های موجود صحبت می کنند. این واژه های در واقع همان چیزی است که ما به نام معماری CPU می شناسیم. در واقع معماری CPU به ما نشان می دهد که CPU چه نوع کدی را می تواند اجرا کند. برای مثال نرم افزارهایی که برای سیستم های 64 بیتی و یا Itanium نوشته شده اند را نمی توان بر روی CPU های 32 بیتی اجرا کرد. اما استثنائی که در اینجا وجود دارد این است که CPU های 64 بیتی قادر به اجرای نرم افزارهای 32 بیتی هستند البته این در صورتی است که سیستم عامل مورد نظر نیز این قابلیت را دارا باشد.
CPU (واحد پردازش مرکزی) در یک کلام مغز کامپیوتر است! قطعهای کوچک با وظیفهای بزرگ؛ پردازش هر دستوری که به آن ارسال میشود. در این مقاله با ما باشید تا به صورت خلاصه با CPU و نحوه کار آن آشنا شوید.
کلمه CPU مخفف عبارت Central Processing Unit به معنای "واحد پردازش مرکزی" است. همچنین این قطعه با نامهای زیر نیز شناخته میشود:
کلمهای که معمولا بهجای CPU مورد استفاده قرار میگیرد Processor است. دلیل آنکه از CPU به عنوان مغز کامپیوتر یاد میشود، این است که CPU مهمترین وظیفه یک کامپیوتر را به عهده دارد یعنی پردازش!
هر سیستم اطلاعاتی برای پردازش دستورات (عملکردهای منطقی، ریاضی و ...) نیاز به یک پردازنده (Processor) دارد. این وظیفه در کامپیوترها بر عهده CPU است.
CPU تقریبا تمامی دستورات داده شده بوسیله نرمافزارها و سختافزارها را با استفاده از عملکردهای منطقی، محاسبات ریاضی و مقایسات پردازش میکند.
CPU با استفاده از یک واحد ALU که مخفف Arithmetic & Logic Unit و به معنای "واحد محاسبه و منطق" است، تمامی دستورات ورودی را محاسبه، مقایسه یا بر طبق عملکردهای منطقی تصمیم گیری کرده و سپس در صورت نیاز، خروجی را تحویل میدهد. این فرایند بر روی ثباتهای پردازنده به عنوان میزکار سی پی یو انجام میشود. منظور از عملکردهای ریاضی، همان چند عمل ساده مثل ضرب، تقسیم، جمع و تفریق است.
برای درک بهتر عملکرد CPU ، میتوانید مغز انسان را به یاد آورید. ممکن است انسان بتواند بدون برخی از اعضای دیگر (در کامپیوتر مانند حافظههای جانبی و...)، به حیات خود ادامه دهد اما بدون مغز، امکان زندگی صفر است. در واقع شما نمیتوانید هیچ تصمیمی بگیرید، اطلاعات را پردازش کنید، تصاویر را درک کنید، به سایر اعضا دستور بدهید و ... . مغز یک پردازنده قوی همانند CPU است.
در سیستمهای بزرگ مانند سرورها ممکن است چندین CPU استفاده شود اما در سیستم های شخصی (PC مخفف Personal Computer ) معمولاً فقط یک فضا (Slot) برای CPU بر روی برد اصلی (Motherboard یا Mainboard) وجود دارد.
هر Motherboard معمولاً فقط یک Slot برای اتصال به CPU دارد که محدوده خاصی از انواع CPU ها را پشتیبانی میکند. یکی از مهمترین نکاتی که در هنگام خرید Motherboard یا CPU ویا تعوض و آپگرید (Upgrade) پردازنده باید مورد توجه قرار گیرد، نوع پردازنده پشتیبانی شده توسط Motherboard است. ممکن است پردازندهای که قصد خرید را دارید، توسط مادربرد شما پشتیبانی نشود.
پردازندهها معمولاً دارای 3 شاخص مهم هستند که بر روی قیمت آنها نیز تاثیر بسیاری میگذارند. این سه شاخص عبارت اند از:
یکی از مهمترین عوامل در انتخاب و خرید یک پردازنده سرعت کلاک (Clock Speed) آن است که برای همه هستههای آن معمولاً عددی ثابت است. سرعت پردازنده نشانگر تعداد عملی است که یک هسته میتواند در هر ثانیه انجام دهد و واحد آن هرتز (Hertz) است که معمولاً به صورت مگاهرتز (MHz - میلیون هرتز) یا گیگاهرتز (GHz - میلیارد هرتز) بیان میشود.
برای مثال پردازندهای که سرعت آن 2.5 گیگاهرتز است، میتواند در هر ثانیه 2 میلیارد و نیم (2800000000) دستور را پردازش کند. درصورتی که پردازنده دارای هستههای بیشتر باشد، هر هسته میتواند بصورت مجزا 2800000000 دستور را پردازش کند. البته منظور دستورات ساده یک سیکلی هستند (مثلاً در طراحی RISC تقریباً همه دستورات یک سیکلی هستند) که در یک چرخه (Cycle) اجرا میشوند.
حافظه کش وظیفه حفظ داده را دارد و به دلیل اینکه سرعت آن بسیار بیشتر از حافظه اصلی (RAM) است، بنابراین تاخیر در اجرای دستورات را بسیار میکاهد. پردازنده برای بدست آوردن داده، ابتدا حافظه نهان خود را چک میکند و در صورتی که در آن حافظه، داده مورد نظر وجود نداشته باشد به سراخ حافظه اصلی میرود. به این صورت حافظه نهان بر روی سرعت پردازنده تاثیر زیادی دارد.
برای مثال پردازنده اینتل i7-2600 دارای دو ست 4 * 32 کیلوبایت برای حافظه نهان لایه اول (L1) که یکی وظیفه حفظ داده و دیگری وظیفه حفظ دستورات را دارد. این پردازنده دارای 4 * 256 کیلوبایت حافظه لایه دوم (L2) بوده و 8 مگابایت حافظه لایه سوم (L3) دارد.
هستههای پردازنده، درواقع پردازندههای مستقلی هستند که هر یک به صورت جداگانه دستورات را پردازش میکند. امروزه پردازندهها معمولاً دارای بیش از یک هسته هستند که به کاربران این امکان را فراهم میکنند که مجموعه دستورات یا برنامههای خود را با استفاده از پردازش موازی (Parallel Computing) سریع تر از قبل اجرا کنند. البته داشتن هستههای بیشتر به معنای افزایش کارایی کلی پردازنده نیست. چون بسیاری از برنامهها هنوز از پردازش موازی استفاده نمیکنند. یعنی عملاً سایر هستهها کار به مراتب کمتری نسبت به یک هسته انجام میدهند.
البته با تکنولوژیهایی مثل هایپرتریدینگ (Hyper Threading) یک هسته، خود به جندین ریسمان یا به زبان ساده، هسته مجازی تقسیم میشود. برای مثال پردازندههای i5 دو هستهای اینتل، با استفاده از این تکنولوژی به چهار ریسمان یا هسته مجازی تقسیم میشوند.
در پروسه پردازش دستورات در CPU چهار مرحله اصلی وجود دارد: 1- فراخوانی 2- رمزگشایی 3- پردازش و اجرا 4- بازنویسی
این چهار مرحله اصلی به ترتیب اجرا شده و فرآیند پردازش دستور به اتمام میرسد.
نوشتن برنامهها به زبان باینری بسیار سخت است به همین خاطر زبانهای برنامه نویسی سطح بالایی وجود دارد که نوشتن برنامه را آسانتر میکند. زبانهای برنامه نویسی مختلفی وجود دارد که سازندگان برنامهها میتوانند از آنها استفاده کنند. به همین دلیل واحدی به نام Assembler (تبدیل کننده به اسمبلی) وجود دارد که ابتدا دستورات را به زبان سطح پایین اسمبلی (Assembly) تبدیل کرده سپس واحد دیگری این دستورات اسمبلی را به کدهای OP تبدیل میکند. حال این دستورات که به صورت کدهای OP در آمده اند، آماده پردازش در واحد پردازنده CPU هستند.
ممکن است درحین پردازش، نیاز به یک دستور دیگر باشد که در این صورت Program counter دستور مورد نیاز را در اختیار واحد پردازنده CPU قرار میدهد یا ممکن است واحد پردازش، دستورات را برای زمان دیگری در ثباتهای (Registers) داخلی خود ذخیره کند.
در اغلب موارد، CPU این مقدار خروجی را که از مرحله اجرا و پردازش بدست آورده است را در ثباتهای خود ذخیره میکند. با این کار، CPU میتواند از این خروجیها به سرعت در دستورات دیگر استفاده کند. فرض کنید یک عملیات مقایسه به CPU برای پردازش ارسال میشود. در این گونه موارد، CPU از مقادیر خروجی قبلی که در ثباتهای خود ذخیره کرده استفاده میکند تا نتیجه مقایسه را در یکی از ثباتهای دیگر خود، یا به عنوان خروجی باز گرداند.
در این چهار مرحله اصلی، پردازنده فقط یک دستور که از Program Counter ارسال شده را پردازش میکند. پس از اتمام این چهار مرحله، درصورتی که دستور دیگری در صف پردازش وجود داشته باشد، توسط PC به سی پی یو داده میشود و مراحل از اول شروع میشوند تا زمانی که تمامی دستورات پردازش شوند.