پروژه درس ریزپردازنده
نام دانشجو مهدی سلامی
معماری پردازنده های RISC و CISC
مقدمه:
تعریف پردازنده:
واحد پردازش مرکزی (پردازنده) یاCPU که مخفف عبارت Central Processor Unit میباشد مانند مغز و بخش اصلی کامپیوتر است که مسئول پردازش تمامی دستورالعملها و مدیریت کلیه مراحل پردازش دادهها است.
عملکرد پردازنده شامل سه مرحله است:
(Fetch)
واکشی یا همان دریافت دادهها و دستورالعمل اولین مرحله از مراحل عملکرد پردازنده است. در این مرحله سی پی یو دستورالعملهایی که توسط کاربر به کامپیوتر داده میشود در قالب صفر و یک از RAM دریافت میکند که این دستورالعملها یک بخش کوچک از عملیاتی است که قرار است بر روی دادهها انجام شود؛ بنابراین سی پی یو برای انجام کامل عملیات باید بداند دستورالعمل بعدی کاربر چیست. آدرس دستور فعلی دادهشده به سیستم توسط شمارنده سیستم یا(Program Counter) که بهاصطلاح به آن PC میگویند نگهداری میشود سپس PC به همراه دستورالعملها در واحد ثبت دستور (Instruction Register) که اصطلاحاً به آن IR میگویند درج میشوند و در آخر مقدار PC یک واحد افزایش مییابد تا به نشانی دستورالعمل بعدی ارجاع داده شود. در فرآیند واکشی با توجه به محتوای PC محل قرار گرفتن دستور بر روی حافظه مشخص میشود و درصورتیکه یک دستور بهصورت جهش (Jump) اجرا شود شمارنده برنامه به آدرس دستوری که جهش به آن نقطه انجامشده است تغییر پیدا میکند.
رمزگشایی (Decode):
وقتیکه یک دستور واکشی شد در واحدی به نام ثبت دستورالعمل (Instruction Register) ذخیره میشود و سی پی یو دستورالعملها را به یک واحد به نام رمزگشای دستورالعمل (مدار کدگشایی دستورالعمل) که با نام خارجی (Instruction Decoder) شناخته میشود ارسال میکند. در واحد رمزگشایی دستورات به سیگنالهایی تبدیل میشوند و برای اقدامهای مختلف به واحدهای دیگر پردازنده فرستاده میشوند.
اجرا (Execute):
اجرا آخرین مرحله از سه مرحله عملکرد سی پی یو میباشد. در این مرحله دستورات رمزگشاییشده برای تکمیل فرآیند پردازش به قسمتهای مربوطه در CPU ارسال میشوند و نتایج تکمیل فرآیند در بخشی به نام حافظههای ثبات نگهداری میشوند تا در دستورات بعدی به آنها ارجاع شود.
واحدهای یک پردازنده:
واحد محاسبه و عملیات منطقی(ALU):
واحد محاسبه و عملیات منطقی(ALU) یک مدار دیجیتالی پیچیده است که عملیات ریاضی و مقایسهای را انجام میدهد و بعد از پردازش اطلاعات توسط ALU آنها را حافظه کامپیوتر ارسال مینماید. چندین واحد محاسبه و منطق را میتوان درCPU، GPU وFPU یافت. در برخی پردازندههای رایانهای، ALU به AU وLU تقسیم میشود. AU عملیات حسابی را انجام میدهد و LU عملیات منطقی را انجام میدهد.
واحد کنترل حافظه (CU):
واحد کنترل یا CU مداری است که عملیات را درون پردازنده رایانه هدایت و مدیریت میکند و این امکان را به واحد محاسبه و منطق و همچنین دستگاههای ورودی و خروجی میدهد که چگونه میتوانند به دستورالعملهای دریافت شده از یک برنامه پاسخ دهند. واحد کنترل با دریافت اطلاعات ورودی که آن را به سیگنالهای کنترلی تبدیل میکند، کار میکند و سپس به پردازنده مرکزی ارسال میشود و پردازنده به سختافزار متصل میگوید چه عملیاتی را باید انجام دهد. کارکردهایی که یک واحد کنترل انجام میدهد، به دلیل واریانس معماری بین تولیدکنندگان مختلف، به نوع CPU بستگی دارد.
واحد حافظه ثبات (Register):
CPU های مختلف دارای حافظه ثباتهای گوناگون میباشند. بعضی از رجیسترها برای نگهداری نتایج اعمال استفاده میشوند و بعضی دیگر بهعنوان اشارهگر و برخی نیز برای اهداف دیگر میباشند. دستورالعملها مجاز هستند که با سرعتی برابر با 16، 32 یا 64 بیت پردازش شوند و بهعنوانمثال اگر برنامهای برای پردازش دستورالعملهای 64 بیتی طراحیشده باشد، پردازندهای با ثبت 32 بیتی قادر به اجرای آن برنامه نیست
اولین پردازنده اینتل 4004 بود که در سال 1971 معرفی شد. ریز پردازنده 4004 چندان قدرتمند نبود و تنها کاری که میتوانست انجام دهد جمع و تفریق بود و همزمان تنها با 4 بیت کار میکرد. اما شگفتآور بود که همه چیز روی یک تراشه قرار داشت. قبل از 4004، مهندسان کامپیوترها را از مجموعه تراشهها یا از اجزای گسسته مانند ترانزیستورها میساختند. ریزپردازنده 4004 مجهز به یکی از اولین ماشینحسابهای الکترونیکی قابل حمل بود.
طراحیRISC چیست؟
کلمه RISC (ریسک) ساده شده یا مخفف عبارت Reduced instruction set computing به معنای "مجموعه دستورات محاسباتی ساده شده" یا "مجموعه دستورات بهینه شده" است.
ریسک یکی از طراحیهای پردازنده است که بر اساس ساده سازی و بهینه کردن مجموعه دستورات طراحی شده و به عبارت بهتر، بجای پردازش مجموعهای از دستورالعملهای پیچیده، از دستورات بسیار ساده تر و بهینه تری برای پردازش استفاده میکند که باعث کارایی و عملکرد بسیار بهینه تر آن میشود. ریسک از روش لولهای (Pipe-line) برای پردازش استفاده میکند. ARM از مهمترین معماریهایی است که همراه با این طراحی در بسیاری از پردازندههای از پیش نصب شده مورد استفاده قرار میگیرد.
طراحی RISC از آن جایی شروع شد که طبق محاسبات مختلف شرکت Berkeley RISC، مشخص شد که کل دستورات موجود در سیستم عامل یونیکس (Unix)، تنها از ۳۰% دستورات قابل استفاده در ریزپردازنده Motorola 68000 که طبق طراحی CISC (سیسک - در مقابل طراحیRISC که از مجموعه دستورات پیچیده تری استفاده میکنند؛ مثل معماری x86 اینتل) ساخته شده بود، استفاده میکرد. به این ترتیب ۷۰% از دستورات پیچیده تر این ریزپردازنده اصلاً مورد استفاده قرار نمیگرفت و در نهایت قسمتی از ریزپردازنده بلااستفاده باقی مانده و هستههای آن فضای بی موردی را اشغال میکنند چون بدیعی است که با افزایش امکانات پردازنده، فضای فیزیکی مورد استفاده نیز بیشتر میشود. همچنین مقداری از توان مصرفی آن نیز بیهوده بوده و باعث گرم شدن آن میشود.
البته منظور از دستورات ساده این است که اکثر آنها در یک سیکل پردازش میشوند بنابراین طراحی RISC بسیار ساده تر از طراحیهای دیگری مانند CISC است. در ساختار RISC به دلیل همین سادگی، معمولاً فرکانس کاری پردازنده بیشتر از طراحیهایی مثل CISC ثبت میشود درحالی که در RISC دستورات به صورت ابتدایی، بهینه و کوتاه پردازش میشوند؛ بنابراین در فرکانس کلاک مشخص، معمولاً کارایی کمتری نسبت به طراحی CISC دارند. یکی دیگر از خصوصیات مهم طراحی ریسک دسترسی به حافظه RAM است. درRISC دسترسی به دادههای موجود در آدرسهای مشخص از رم تنها به تعدادی دستور ویژه (Load/Store) محدود شده که امکان دسترسی به دادههای رم را از طریق سایر دستورات غیرممکن میکند.
برای مثال، فرض کنید که قصد ضرب کردن دو عدد را داریم توجه کنید که برای درک بهتر، همه چیز به صورت ساده بیان شده است. در حافظه RAM و در آدرسهای a50 وa51 به ترتیب اعداد ۳ و ۲ ذخیره شده اند. با استفاده از دستورهای زیر در زبان اسمبلی و در طراحی RISC ، میتوانیم این دو عدد را در یکدیگر ضرب کنیم:
LOAD r1, a50
LOAD r2, a51
PROD r1, r2
STORE a50, r1
در دستور اول و دوم، به ترتیب دادههای موجود در آدرس a50 و a51 را در ثباتهای r1 و r2 ذخیره میکنیم. در خط سوم، این دو عدد را در یکدیگر ضرب کرده و در خط آخر هم این مقدار را در آدرس a50 مینویسیم. توجه کنید که کل این فرایند را در طراحی CI
به خاطر همه این دلایل، برنامههایی که برای طراحی ریسک ساخته میشوند اغلب طولانی تر نسبت به همان برنامه در طراحی سیسک بوده و امکان اجرا شدن برنامهای که برای یک طراحی خاص ساخته شده، بر روی طراحی دیگر، قابل اجرا نیست. البته ممکن است برنامه از طریق کامپایلرهای چندمنظوره طوری ساخته شود که بر روی هر دو طراحی قابل اجرا باشد. مثل برنامههای اندروید (که از هسته لینوکس بر روی پردازندههای مبتنی بر ARM و طراحی RISC یا مبتنی برx86 و طراحی CISC ساخته شده اند) که قابل اجرا بر روی پردازندههای متفاوتی هستند.
طراحی ریسک معایب خودش را نیز دارد از جمله؛ زیاد بودن رجیسترها، با این که سریع ترین حافظههای پردازنده هستند، باعث تاخیر در انتقال دادهها میشود. از طرفی به دلیل ساده بودن دستورات ریسک، این طراحی معمولاً نیاز به RAM بیشتری نیز دارد.
چرا استفاده از طراحی RISC بسیار رایج است؟
ترانزیستورهای موجود در هر هستهRISC که برای پردازش منطقی مورد استفاده قرار میگیرد، بسیار کمتر از تعداد ترانزیستورهایی است که بر روی طراحی CISC استفاده میشوند. که سبب کاهش اندازه کامل شده پردازنده شده و در نتیجه به صورت قطعات کوچکتر میتوانند در اغلب ابزارهای الکتریکی مورد استفاده قرار گیرند. همچنین ترانزیستور کمتر به معنای کاهش مصرف انرژی شده و باعث میشود پردازنده به نسبت، کمتر گرم شود.البته طراحی ریسک، ثباتی بیشتری در اختیار کاربران و برنامه نویسان قرار میدهد اگر چه از انواع مهم دادهها (مثلاً اعداد اعشاری) پشتیبانی نمیکند.
همه این دلایل باعث میشوند که پردازندههای ساخته شده توسط طراحی RISC به خصوص همراه با معماری ARM هزینه تمام شده بسیار کمتری نسبت به پردازندههای CISC داشته باشند. به این ترتیب میتوان از آنها در اغلب دستگاهها از تلفنهای ثابت گرفته تا سوپرکامپیوترها استفاده کرد. البته بیشترین کاربرد این پردازندهها در دستگاههایی هستند که به نسبت، نیاز به پردازش و توان مصرفی کمتری دارند مانند تلفنهای هوشمند، تبلتها، ساعتهای هوشمند و... .
معماریها مهمی که ازRISC استفاده میکنند:
ریسک به خاطر مزایایی که دارد در اغلب پردازندههای کم هزینه استفاده میشود. از جمله معماریهایی که از طراحی ریسک استفاده میکنند عبارت اند از:
- یکروکنترلر ATXMEGA128A3 که از طراحی RISC استفاده میکند
- پردازندهA4 اپل که از معماریARM با طراحیRISC استفاده میکند
طراحی CISC چیست؟
کلمه CISC (سیسک) ساده شده و مخفف عبارتComplex instruction set computing به معنای "مجموعه دستورات محاسباتی پیچیده" یا "مجموعه دستورات پیچیده" است.
یکی از طراحیهای پردازنده است که بر اساس جمع کردن مجموعهای از دستورات سطح پایین (Low-level) به عنوان تنها یک دستور ساخته شده است و در مقابل طراحی RISC قرار دارد. در این طراحی مجموعهای از دستورات ساده و ابتدایی مثل خواندن از حافظه، انجام عملیات محاسباتی و ذخیره کردن در حافظه، در یک دستور جمع میشوند یعنی بجای نوشتن تک تک این دستورات، میتوانیم از یک دستور استفاده کنیم x86 وx64 از مهمترین معماریهایی هستند که با این طراحی در بسیاری
مجموعه دستورالعمل های پردازنده های CISC
دستورالعمل های CISC ماهیت پیچیده ای دارند و بیش از یک کلمه را در حافظه اشغال می کنند. همانطور که RISC از Load/Store برای دسترسی به عملوندهای حافظه استفاده می کند، CISC نیز دارای دستورالعمل Move برای دسترسی به عملوندهای حافظه است.
اما برخلاف Load and Store، عملیات Move در CISC دامنه وسیع تری دارد. دستورالعمل های CISC می توانند "مستقیماً به عملوندهای حافظه دسترسی داشته باشند".
فرمت کلی دستور Move است
Move destination, source
می تواند یک عملوند فوری را به یک مکان حافظه یا یک ثبات منتقل کند.
Move A, 100
Move R, 100
می تواند عملوند را بین دو مکان حافظه منتقل کند.
Move A, B
می تواند عملوند را بین دو ثبات انتقال دهد.
Move R1, R2
شامل پنج حالت آدرس دهی اساسی مانند:
حالت فوری، حالت مستقیم/مطلق، حالت ثبت، حالت غیر مستقیم و حالت نمایه.
مجموعه دستورالعمل CISC دارای چند حالت آدرس دهی اضافی است. اینها «حالت افزایش خودکار»، «حالت کاهش خودکار» و «حالت نسبی» هستند.
حالت افزایش خودکار:
در اینجا، آدرس مؤثر یک عملوند، محتوای رجیستر است. پس از دسترسی به محتوای رجیستر، به طور خودکار افزایش می یابد تا مکان حافظه عملوند بعدی مشخص شود.
حالت کاهش خودکار:
در اینجا نیز، آدرس مؤثر یک عملوند، محتوای رجیستر است. اما در اینجا ابتدا محتوای رجیستر کاهش می یابد و سپس محتوای رجیستر به عنوان یک آدرس موثر برای عملوند استفاده می شود.
حالت نسبی:
این شبیه به "حالت ثبت شاخص" است که در آن آدرس موثر با افزودن یک ثابت به محتوای ثبت همه منظوره به دست می آید. در حالت نسبی به جای یک ثبات همه منظوره، از شمارنده برنامه استفاده می شود. این نوع حالت آدرس دهی برای ارجاع محدوده وسیعی از ناحیه در حافظه استفاده می شود.
اکنون در بالا ذکر کردیم که پردازنده CISC تعداد دستورالعمل ها را به حداقل می رساند که طول کد را نسبتاً کوتاهتر می کند.
اجازه دهید ببینیم چگونه دستورالعمل های سبک CISC طول کد را به حداقل می رساند؟
فرض کنید ما یک عملیات داریم
A= B+C
Move A, B
Add A, C
هدف چهار دستورالعمل سبک RISC تنها با دو دستورالعمل سبک CISC برآورده می شود.
بنابراین می توان گفت که معماری CISC به طور موثر تعداد دستورالعمل های برنامه را به عنوان یک اجرای دستورالعمل به حداقل می رساند، چندین دستورالعمل سطح پایین را در یک برنامه اجرا می کند.
سیسک طراحیای است که زبانهای سطح بالا را بوجود میآورد. البته نباید از معایب آن نیز گذشت. برای مثال، بسیاری از دستورات پیچیده در طراحی سیسک اغلب استفاده نمیشوند و از طرفی، هزینه تولید پردازندههایی که برپایه طراحی سیسک هستند، بسیار بیشتر است و تعداد رجیستری عمومی آن نیز کم هست
در طراحی سیسک امکان استفاده از قابلیت پردازشی لولهای (Pipe-line) وجود ندارد؛ چون دستورات به دلیل پیچیدگیهایی که دارند اندازهها و فرم دادههایی که خواهند خواند مشخص نیست. به علاوه، دستورات در طراحی CISC در چرخههای متفاوتی پردازش میشوند. برای مثال ممکن است دستوری در یک چرخه و دستور دیگری در ۶ چرخه تکمیل شود. به این ترتیب استفاده از پایپ لاین در طراحی سیسک بر خلاف طراحی با وجود نداشتن قابلیت پایپ لاین، سرعت در پردازندههای طراحی شده برپایه سیسک بیش از پیش اهمیت خود را نشان خواهد داد. برای مقایسه سرعت پردازندههای سیسک میتوان از فرمول زیر استفاده کرد که در سه حالت مختلف بیان میشود. در این فرمول، نتیجه همان زمان لازم برای اجرای کامل برنامه است. البته به دلیل اینکه ممکن است برخی از دستورات در چرخههای متفاوتی اجرا شوند، از این فرمول نمیتوان به صورت دقیق برای محاسبات استفاده کرد
پارامتر اول ("تعداد دستورات در برنامه") تنها از طریق خود برنامه قابل تغییر است. ممکن است برنامهای نوشته شود که دارای ۱۰۰ دستور یا ۱۰۰۰۰۰ دستور باشد. در طراحی سیسک، تلاش بر این است که این پارامتر کمتر شود. یعنی تعداد دستوراتی که در برنامه وجود دارند، کمتر شوند. البته میدانیم که در مقابل، CPI آن بیشتر خواهد شد.
پارامتر دوم ("تعداد چرخه در هر دستور") نشان دهنده تعداد چرخهای (Cycle) است که برای اجرا کردن یک دستور استفاده میشود. در طراحی سیسک، سعی بر این میشود که روند افزایشی این پارامتر را در مقابل پارامتر اول، کندتر کند.
پارامتر سوم ("تعداد چرخه در یک ثانیه") اغلب به معماری و طراحی فیزیکی پردازنده بستگی دارد و همان فرکانسی است که هنگام خرید یک پردازنده ذکر میشود؛ مثلاً پردازنده ۲.۴ گیگاهرتزی (GHz).
چرا CISC مورد نیاز بسیاری از کاربران است؟
پردازندههایی که بر پایهCISC طراحی میشوند معمولاً در اغلب کامپیوترهای شخصی، لپتاپها وسرورها یافت میشوند دلیل آن هم کارایی بهتر و بهینه تر بودن آن برای برنامه نویسان است. با استفاده از طراحی سیسک که از دستورات پیچیده تری استفاده میکند، برنامه نویسان میتوانند برنامهها و اپلیکیشنهای کوچکتری ساخته و از قدرت پردازشی بیشتر سیسک استفاده کنند.علاوه بر قدرت پردازشی بیشتری که پردازندههای سیسک دارند، به دلیل همین طراحی پیچیده، سیستمهایی که برپایه آن کار میکنند، نیاز به حافظه کمتری دارند.
درمقابل، سیسک دارای دستورات زیادی است که این حجم از دستورات باعث گستردگی اندازه فیزیکی این طراحی نسبت به RISCشده است و همین امر باعث افزایش بسیار زیاد تعداد ترانزیستورهایی میشود که برای پردازش منطقی مورد استفاده قرار میگیرند و در نتیجه هزینه تولید آن نیز به مراتب افزایش مییابد. همچنین این تعداد از ترانزیستورها و کنترل کنندهها نیازمند انرژی زیادی هستند که انرژی مصرف شده و در نهایت گرمای حاصل را زیاد میکند.
به دلیل این که بسیاری از برنامهها و سیستم عامل ها برای معماری x86 ساخته میشوند که از طراحیCISC استفاده میکند، همچنین به دلیل کارکرد بهترCISC نسبت به RISC، طراحی RISC نمیتواند جایگزین طراحی CISC در سیستمهای شخصی، لپتاپها و سیستمهای پیشرفته که نیاز به پردازش مجموعه بزرگی از دادهها و دستورات را دارند، شود. از طرفی به خاطر همه این دلایل، سیسک نیز نمیتواند جایگزین طراحی ریسک شود. به عبارت دیگر، RISC در ابزارهای کوچک که نیاز به پردازش و مصرف انرژی کم دارند و CISC در ابزارهایی که نیاز به پردازش زیاد و سریع دارند، کاربرد بهتری دارد.
معماریها مهمی که ازCISC استفاده میکنند:
سیسک به خاطر مزایایی که دارد در اغلب پردازندههای PC و سایر پردازندههایی که نیاز به پردازش سنگینی دارند، استفاده میشود. از جمله معماریهایی که از طراحی سیسک استفاده میکنند عبارت اند از:
پردازنده AMD از خانواده FX که از طراحی CISC و معماری x64 استفاده میکنند
پردازنده Core i7 4770k اینتل با طراحی CISC ومعماری x64