ریزمعماری
در مهندسی کامپیوتر، ریز معماری یا همان سازماندهی کامپیوتر که گاهی به آن به صورت اختصار µarch و یا uarch می گویند، شیوه ای است که از طریق آن یک معماری مجموعه دستورالعمل (ISA)، در یک پردازنده خاص پیاده سازی می شود.[1] یک معماری مجموعه دستورالعمل، ممکن است از طریق ریز معماریهای متفاوتی پیاده سازی شود. [2][3]پیاده سازی ها ممکن است به دلیل اهداف متفاوت از طراحی یا به دلیل تغییر تکنولوژی، تفاوت داشته باشند.[4]
معماری کامپیوتر ترکیبی از ریز معماری و معماری مجموعه دستورالعمل است.
ارتباط با معماری مجموعه دستورالعمل
معماری مجموعه دستورالعمل، تقریباً مشابه یک مدل برنامه نویسی برای یک پردازنده است، چنانکه توسط یک برنامه نویس زبان اسمبلی یا نویسنده ی کامپایلر دیده می شود. معماری مجموعه دستورالعمل، حاوی مدل اجرا، ثباتهای پردازنده، فرمت های آدرس و داده و ... است. ریز معماری، حاوی اجزای تشکیل دهنده ی پردازنده است و اینکه چگونه این اجزا به یکدیگر متصل می شوند و با هم همکاری میکنند تا ISA را پیاده سازی کنند.
ریز معماری یک ماشین معمولاً به شکل دیاگرام هایی (با جزئیات زیاد یا کم) نشان داده می شود، که توصیف کننده ارتباطات بین عناصر مختلف ریز معماری ماشین است که ممکن است حاوی هر چیزی، از گیت های منفرد و رجیستر ها گرفته تا واحد محاسباتی و منطق (ALU) کامل و حتی عناصر بزرگتر باشد. این دیاگرام ها به طور کلی، مسیر داده (datapath، جایی که داده قرار داده می شود) و مسیر کنترل ( که می توان گفت داده را هدایت می کند) را از هم جدا می کنند.[5]
فردی که یک سیستم را طراحی میکند، معمولاً ریز معماری خاصی را به شکل نوعی دیاگرام جریان داده رسم می کند. دیاگرام ریز معماری، شبیه یک دیاگرام بلاک، عناصر معماری از جمله مثلاً واحد محاسباتی و منطق و فایل رجیستری را به شکل یک سمبل شماتیک نشان می دهد. به طور معمول این دیاگرام عناصر مذکور را به وسیله فلش ها، خطوط ضخیم و خطوط باریک نشان میدهد تا موارد زیر را افتراق دهد: گذرگاه های سه وضعیتی (که نیازمند یک بافر سه-وضعیتی برای هر ابزاری است که از گذرگاه استفاده می کند)، گذرگاه های یک طرفه (همیشه توسط یک منبع استفاده می شود، مثلاً در کامپیوترهای ساده، که همیشه گذرگاه آدرس توسط رجیستر آدرس حافظه راه اندازی می شوند)، و خطوط کنترل منفرد. کامپیوترهای بسیار ساده دارای یک سازماندهی گذرگاه داده ی منفرد هستند- آن ها دارای یک گذرگاه سه وضعیتی منفرد هستند. در دیاگرام کامپیوترهای پیچیدهتر معمولاً چندین گذرگاه سه وضعیتی وجود دارد که کمک می کند تا ماشین بتواند عملیات بیشتری را به طور همزمان انجام دهد.
هر عنصر ریز معماری، توسط یک شماتیک نمایش داده می شود که توصیف کننده اتصالات بین دروازه های منطقی مورد استفاده برای پیاده سازی آن است. هر دروازه منطقی، توسط یک دیاگرام مدار نمایش داده میشود که توصیف کننده اتصالات ترانزیستور های مورد استفاده برای پیاده سازی آن در خانواده ی منطقی خاصی است. ماشین هایی که دارای ریز معماری متفاوت هستند، ممکن است دارای ISA یکسان باشند، و بنابراین می توانند برنامه های مشابهی را اجرا کنند. ریز معماری های جدید و/یا راه حل های مداربندی، همراه با پیشرفت در تولید نیمه رسانه ها موجب شده است تا نسل های جدید پردازنده ها درحالی که از ISA مشابهی استفاده میکنند، به عملکردهای بالاتری دست یابند.
به طور کلی، یک ریز معماری، می تواند به تنهایی چندین ISA مختلف را فقط با تغییرات کوچکی در ریز کد اجرا کند.
ویژگی ها
مسیر داده خط لوله (pipeline) شایعترین طراحی مسیر داده در معماری های امروزی است. این تکنیک در اکثر ریزپردازنده های جدید، میکروکنترلرها و پردازندههای سیگنال دیجیتال استفاده می شود. معماری خط لوله ای امکان اجرای چندین دستورالعمل را بهصورت همپوشان فراهم می کند که بسیار شبیه یک خط سر هم بندی است. خط لوله حاوی چندین مرحله ی متفاوت است که در طراحی های ریز معماری اهمیت زیادی دارند. برخی از این مراحل عبارتند از: واکشی(fetch)، کدگشایی دستورالعمل (decoding)، اجرا (execution)، و نوشتن مجدد. برخی معماری ها حاوی مراحل دیگری هستند از جمله، دسترسی به حافظه. طراحی خط لوله ها یکی از مهمترین کارهای مربوط به ریز معماری است.
واحدهای اجرایی نیز اهمیت زیادی در ریز معماری دارند. واحدهای اجرایی عبارتند از: واحدهای محاسباتی و منطق (ALU) واحدهای ممیز شناور (FPU)، واحدهای بارگذاری/ذخیرهسازی (load/store)، پیش بینی انشعاب و SIMD. این واحد ها عملیات یا محاسبات یک پردازنده را انجام می دهند. انتخاب تعداد واحدهای اجرایی، تاخیر آنها، و بازدهی آنها، یک بخش مهمی از طراحی در رابطه با ریز معماری است. اندازه تاخیر، بازدهی، و اتصالات حافظه ها در داخل سیستم، نیز تصمیم های مربوط به ریز معماری است.
تصمیمات طراحی سطح-سیستمی، من جمله اینکه آیا ابزارهای جانبی نظیر کنترل کننده های حافظه هم باید اضافه شوند یا خیر، را می توان بخشی از فرایند طراحی ریز معماری در نظر گرفت، که می تواند شامل تصمیماتی در رابطه با سطح عملکرد و اتصالات این ابزارهای جانبی باشد.
برخلاف طراحی معماری، که در آن دست یابی به یک سطح عملکرد خاص هدف اصلی است، طراحی ریز معماری توجه بیشتری به سایر محدودیت ها دارد. از آنجایی که تصمیمات مربوط به طراحی ریز معماری، اثر مستقیمی بر این دارد که چه چیزی داخل سیستم می شود، لذا باید به مسائلی همچون مساحت/هزینه ی چیپ، مصرف انرژی، پیچیدگی منطقی، سهولت اتصالات، قابلیت تولید، سهولت خطا زدایی و قابلیت تست شدن توجه کرد.
مفاهیم ریزمعماری
چرخه های دستورالعمل
تمام پردازنده های تک تراشه ای یا چند تراشهای برای اجرای برنامه ها:
- ۱. یک دستورالعمل را می خوانند و آن را کدگشایی می کنند.
- ۲. داده ای را که برای پردازش دستورالعمل لازم است، پیدا می کنند.
- ۳. دستورالعمل را پردازش می کنند.
- ۴. نتایج را می نویسند.
این چرخه ی دستورالعمل تا زمانی که کامپیوتر روشن است، تکرار می شود.
ریز معماری چند چرخه ای
از نظر تاریخی، اولین کامپیوتر ها دارای طراحی چند چرخه ای بودند. معمولاً کوچکترین و ارزانترین کامپیوتر ها هنوز از این تکنیک استفاده می کنند. معماری های چند چرخه ای معمولاً از کمترین تعداد عناصر منطقی و مقادیر قابل قبولی از انرژی استفاده می کنند. این معماریها را می توان طوری طراحی کرد، تا دارای زمان بندی مشخص و اعتماد پذیری بالایی باشند. از آنجاییکه آن ها فاقد خط لوله هستند در نتیجه دچار معطلی بدلیل انشعابات شرطی یا وقفه ها نمی شود. با این وجود، سایر ریز معماری ها، معمولاً دستورالعمل های بیشتری به ازای واحد زمانی انجام میدهند و در عین حال از خانواده منطقی مشابهی استفاده می کنند. زمانی که در رابطه با بهبود عملکرد صحبت می کنیم، معمولاً منظور ما یک طراحی چند چرخه ای است.
در یک سیستم چند چرخه ای، کامپیوتر در طی چندین چرخه ی ساعت، چهار مرحله را به ترتیب انجام می دهد. برخی طراحی ها می توانند توالی مذکور را، با کامل کردن مراحل پشت سرهم در لبه های ساعت، بهصورت یک در میان، در دو چرخه ی ساعت انجام دهند. در این حالت، معمولاً عملیات طولانیتر در خارج از چرخه اصلی رخ می دهد. برای مثال، مرحله ۱ در لبه بالارونده ی اولین چرخه و مرحله ۲ در لبه ی پایین رونده ی اولین چرخه و به همین شکل ادامه پیدا میکند.
در منطق کنترل، ترکیبی از شمارنده ی چرخه، وضعیت چرخه (بالا یا پایین)، و بیت های رجیستر کدگشایی دستورالعمل، مشخص می کند که دقیقاً هر قسمت از کامپیوتر باید چه کاری انجام دهد. برای طراحی منطق کنترل می توان جدولی از بیت ها را ایجاد کرد که در هر چرخه از هر دستورالعمل، سیگنال های کنترل به هر قسمت از کامپیوتر را مشخص میکند. سپس این جدول منطقی را میتوان در یک نرم افزار شبیه ساز که کد تست را اجرا می کند، تست کرد. اگر این جدول منطقی، در یک حافظه قرار داده شود و به شکل واقعی برای به راه انداختن یک کامپیوتر واقعی استفاده شود، آنگاه به آن یک ریز برنامه گویند. در برخی طراحی های کامپیوتری، این جدول منطقی به فرم منطق ترکیبی ساخته شده از گیت های منطقی، بهینهسازی میشود که معمولاً این کار با استفاده از یک برنامه کامپیوتری که منطق را بهینه سازی می کند، انجام می شود. کامپیوتر های قدیمی از طراحی منطقی در موقع لزوم، برای کنترل استفاده می کردند تا زمانی که آقای Maurice Wilkes این روش جدولی را کشف کرد و آن را ریز برنامه نویسی نامید.[6]
افزایش سرعت اجرا
آنچه که این مجموعه مراحل به نظر ساده را پیچیده میکند، این حقیقت است که، سلسله مراتب حافظه که شامل: حافظه نهان، حافظه اصلی، و حافظه غیر فرار نظیر هارد دیسک ها (جایی که دستورالعمل ها و داده ی برنامه قرار دارد) می شود، همیشه کندتر از خود پردازنده است. مرحله ۲، معمولاً موجب یک تاخیر طولانی (از چشم انداز پردازنده) می شود. این تاخیر طولانی، در واقع، مدت زمانی است که داده پس از طی گذرگاه کامپیوتر می رسد. تحقیقات زیادی در رابطه با طراحی هایی انجام شده است که بتواند این تاخیرها را به حداقل ممکن برساند. طی مدت سالیان، هدف اصلی این بود که دستورالعمل های زیادی را به صورت موازی اجرا کنند و بدین طریق، سرعت اجرای مؤثر یک برنامه را افزایش دهند. این تلاش ها منجر به ساختارهای منطقی و مداری پیچیده شد. در ابتدا این ساختارها فقط قابل پیاده سازی روی رایانه های بزرگ یا ابررایانه های گران قیمت و پیشرفته بود، که دلیل آن، میزان مدار بندی مورد نیاز برای آن ها بود. با پیشرفت تولید نیمه هادی ها، ساختار های بیشتری از این دست قابل پیاده سازی روی یک چیپ نیمه هادی منفرد بود.
انتخاب مجموعه دستورالعمل
طی سالیان، مجموعههای دستورالعمل، از انواع بسیار ساده در ابتدا تا انواع بسیار پیچیده (از جنبه های مختلف) تغییر پیدا کرده است. در سال های اخیر، معماری های بارگیری/ذخیره سازی، VLIW و انواع EPIC مرسوم بوده اند. معماری هایی که با موازی گرایی داده مرتبط هستند عبارتند از: SIMD و بردارها. برخی القاب که برای اشاره به کلاس هایی از معماری های پردازنده استفاده می شوند، چندان توصیف کننده نیستند، خصوصاً برچسب CISC. بسیاری از طراحی های ابتدایی که عطف به ماسبق CISC نامیده میشدند، در واقع، به طور چشمگیری سادهتر از پردازندههای جدید RISC (از جنبه های مختلف) هستند.
با این وجود، انتخاب ISA ممکن است تاثیر زیادی روی پیچیدگی پیاده سازی ابزار های با کارایی بالا داشته باشد. رویکرد اصلی که برای ساخت اولین پردازندههای RISC استفاده شد، این بود که دستورالعمل ها تا میزان حداقل پیچیدگی سمانتک منفرد ساده شوند و در عین حال، همراه با نظم کدگذاری و سادگی زیاد باشد. چون این دستورالعمل های یکدست، به شیوه خط لولهی و بهسادگی واکشی، کد گشایی، و اجرا می شدند، لذا یک رویکرد ساده برای کاهش تعداد سطوح منطقی با هدف دستیابی به فرکانسهای اجرایی بالا بود؛ حافظه های نهان دستورالعمل، موجب جبران فرکانس های اجرایی بالا و تراکم کد پایین ذاتی شدند، در حالیکه مجموعههای بزرگ رجیستر، برای کاهش دسترسیهای حافظه تا حداقل امکان استفاده می شدند.
خط لوله دستورالعمل
یکی از ابتدایی ترین و قوی ترین تکنیک ها برای بهبود عملکرد، استفاده از خط لوله دستورالعمل است. طراحی های ابتدایی پردازنده قادر بودند تا تمام مراحل بالا را در یک دستورالعمل اجرا کنند و سپس به سراغ دستورالعمل بعدی بروند. بخشهای زیادی از مدار بندی در هر مرحله بلا استفاده می ماند. برای مثال، ممکن بود مدار کد گشایی دستورالعمل، در طی اجرا بیکار بماند و ... .
خط لوله می تواند عملکرد را بهبود بخشد، به این طریق که اجازه می دهد تا تعدادی دستورالعمل به صورت همزمان در پردازنده مشغول باشند. در همان مثال ابتدایی، پردازنده می تواند، در زمانی که مورد آخر منتظر نتایج است، یک دستورالعمل جدید را کد گشایی (مرحله ۱) کند. این وضعیت باعث می شود تا حداکثر ۴ دستورالعمل به صورت همزمان روی میز کار باشند، که باعث می شود، اینطور به نظر برسد که پردازنده، چهار برابر سریعتر است. اگرچه، هر دستورالعمل برای کامل شدن همچنان نیاز به همان مدت زمان قبلی دارد (کماکان چهار مرحله وجود دارد)، اما پردازشگر به صورت کلی، دستورالعمل ها را بسیار سریع تر کامل می کند.
معماری ریسک با جدا کردن هر مرحله از پردازش دستورالعمل بهصورت تر و تمیز، و یکسان کردن زمان پردازش هر کدام از آنها، موجب کوچکتر شدن و ساده تر شدن خط لوله میشود. پردازنده به شکلی شبیه یک مسیر سرهم بندی کار میکند. بدین صورت که دستورالعمل ها از یک طرف وارد میشوند و نتایج از طرف دیگر خارج میشوند. به دلیل کاهش پیچیدگی خط لوله مرسوم RISC، می توان هسته ی خط لوله ی و حافظه نهان دستورالعملی را در یک دای بتنهایی جا داد. این دای در یک طراحی CISC، فقط می تواند هسته ی مذکور را به تنهایی جا دهد. این وضعیت، دلیل حقیقی سریع تر بودن RISC است. طراحی های ابتدایی نظیر، اسپارک و میپس معمولاً بیش از ۱۰ برابر سریع تر از روش های CISC اینتل و موتورولا، با سرعت ساعت یکسان و هزینه یکسان، اجرا می شدند.
خط لوله ها، به هیچ وجه، محدود به طراحیهای RISC نیستند. در سال ۱۹۸۶، بهترین پیادهسازی VAX ، کهVAX 8800 نام داشت، نوعی طراحی با خط لوله بسیار زیاد بود که اندکی پیش از اولین طراحی های تجاری میپس و اسپارک تولید شد. در حال حاضر، اکثر پردازنده های جدید (حتی پردازنده های نهفته) دارای خط لوله هستند. پردازندههای ریز کدگذاری شده و بدون خط لوله، فقط در پردازنده های نهفته ای که محدودیت بسیار زیادی از نظر مساحت دارند، دیده می شوند. ماشین های CISC بزرگ، از VAX 8800 گرفته تا پنتیوم ۴ و Athlon جدید، هم با ریزکد و هم با خط لوله پیاده سازی شدهاند. بهبود در خط لوله و حافظه نهان، دو مزیت مهم ریز معماری بودند، که باعث شدند عملکرد پردازنده همزمان با پیشرفت تکنولوژی مداری که روی آن پیاده سازی می شوند، افزایش یابد.
حافظه نهان
مدت زمان زیادی طول نکشید، قبل از اینکه پیشرفت در تولید چیپ، این امکان را فراهم آورد تا مداربندی حتی بیشتری روی دای قرار گیرد، و طراحان شروع به یافتن راه حل هایی برای استفاده از آن شدند. یکی از رایجترین این ها، اضافه کردن مقادیر فزایندهای از حافظه نهان (cache) روی دای بود. به طور ساده میتوان گفت، حافظه نهان یک حافظه بسیار سریع است و قابل دسترسی در چند سیکل اندک می باشد، این در حالی است که دسترسی به حافظه اصلی نیاز به سیکل های زیادی دارد. پردازنده دارای یک کنترل کننده ی حافظه ی نهان است که خواندن و نوشتن در کش را به شکل خودکار در می آورد. اگر داده ی مورد نظر در کش وجود داشته باشد، به سادگی نمایان می شود، در حالی که اگر وجود نداشته باشد، پردازنده معطل می ماند تا زمانی که کنترل کننده ی حافظه نهان آن را به داخل خود بخواند.
طراحی های RISC در اواسط تا اواخر دهه ی ۱۹۸۰ شروع به اضافه کردن حافظه نهان کردند، که معمولاً فقط ۴ کیلوبایت حجم داشت. این عدد در طی زمان افزایش یافت و پردازنده های معمول در حال حاضر دارای حداقل ۵۱۲ کیلوبایت حافظه ی نهان هستند، و پردازنده های قوی تر دارای ۱، ۲، یا حتی ۴، ۶، ۸ یا ۱۲ مگابایت حافظه ی نهان هستند که در سطوح مختلفی از سلسله مراتب حافظه، سازماندهی میشوند. در صحبت کلی، هر قدر مقدار کش بیشتر باشد، عملکرد بیشتر میشود که دلیل آن کاهش معطلی است.
حافظه های نهان و خط لوله ها مکمل خوبی برای هم هستند. پیش از این، معنی زیادی نداشت که خط لوله ای درست کنیم که سریعتر از مدت تاخیر دسترسی به حافظه ی خارج از چیپ باشد. به کارگیری حافظه نهان روی چیپ، به این معنی بود که خط لوله میتوانست با سرعتی معادل با تاخیر دسترسی به حافظه نهان، که زمان بسیار کمتری است، اجرا شود. این وضعیت موجب شد تا فرکانس های اجرایی پردازنده ها با سرعت بسیار بیشتری از فرکانس اجرایی حافظه ی خارج از چیپ، افزایش یابد.
پیش بینی انشعاب
یک مانع در برابر دسترسی به عملکردهای بالاتر از طریق موازی سازی در سطح دستورالعمل، معطلی ها و شستشوهای خط لوله به دلیل انشعابات است. به طور معمول، به صورت تاخیری در خط لوله مشخص می شود که آیا یک انشعاب شرطی، عملی خواهد شد یا خیر. زیرا انشعابات شرطی بستگی به نتایجی دارند که از یک رجیستر می آیند. از زمانیکه کدگشای دستورالعمل پردازنده متوجه می شود که با یک دستورالعمل انشعاب شرطی مواجهه شده است، تا زمانیکه مقدار رجیستر تصمیم گیرنده، قابل خواندن می شود، خط لوله باید یا برای چندین چرخه معطل بماند، و یا اینکه اگر نخواهد معطل بماند و انشعاب را انتخاب کند، آنگاه این امکان وجود دارد تا شسته شود. با افزایش سرعت های ساعت، عمق خط لوله نیز افزایش مییابد و برخی پردازندههای جدید ممکن است دارای ۲۰ مرحله و یا حتی بیشتر باشند. به طور متوسط، در هر پنج اجرای دستورالعمل، یک انشعاب وجود دارد. بنابراین، بدون هرگونه مداخله ای دیگر، این مقدار، زمان زیادی از معطلی محسوب میشود.
تکنیک هایی نظیر پیش بینی انشعاب و اجرای حدسی، برای کاهش عوارض انشعاب استفاده می شوند. پیش بینی انشعاب به این معنی است که سخت افزار بر اساس آموزه های قبلی، حدس میزند که آیا یک انشعاب خاص اجرا خواهد شد یا خیر. در واقعیت یک مسیر از انشعاب، در مقایسه با مسیر دیگر، بیشتر فراخوان می شود. طراحی های جدید، دارای سیستم های پیش بینی آماری پیچیدهتری هستند، که از نتایج پیش بینی های قبلی، برای پیش بینی بعدی با دقت بیشتر استفاده می کنند. این حدس ها باعث می شود تا، سخت افزار بدون منتظر ماندن برای خواندن رجیستر، دستورالعمل ها را از پیش واکشی کند. اجرای حدسی، یک قدم فراتر است، به این شکل که، کدی که مربوط به مسیر پیش بینی شده است، نه تنها از پیش واکشی می شود، بلکه قبل از اینکه مشخص شود که آیا انشعاب مذکور باید اجرا شود یا خیر، اجرا نیز می شود. زمانی که حدس درست باشد، این روش منجر به عملکرد بهتر می شود، از سوی دیگر، زمانی که حدس غلط باشد منجر به خسارت زیادی می شود، زیرا دستورالعمل ها باید مجدداً انجام شوند.
سوپر اسکالر
حتی با وجود تمام پیچیدگی و گیت های اضافه ی مورد نیاز برای پشتیبانی از مفاهیمی که ذکر شد، بهبود پیشرفت ها در تولید نیمه هادی، به زودی باعث شد که حتی گیت های منطقی بیشتری مورد استفاده قرار گیرد.
در چارچوب بالا، پردازنده بخشهایی از یک دستورالعمل را در هر لحظه اجرا می کند. اگر بتوان چندین دستورالعمل را به طور همزمان پردازش کرد، آنگاه، برنامه های کامپیوتری می توانند سریع تر اجرا شوند. این همان چیزی است که پردازنده های سوپراسکالر به آن دست یافته اند، یعنی افزایش تعداد واحدهای عملکردی، مثلاً ALUها. افزایش تعداد واحدهای اجرایی، فقط زمانی امکان پذیر شد که مساحت دای در یک پردازنده با قابلیت اجرای یک دستورالعمل در هر چرخه ی ساعت، دیگر فراتر از محدودیت تولید مطمئن نمیرفت. در اواخر دهه ۱۹۸۰، طراحیهای سوپراسکالر شروع به ورود به بازار کردند.
در طراحی های جدید به طور رایجی، دو واحد بارگذاری، یک واحد ذخیره سازی ( بسیاری از دستورالعمل ها نتیجهای برای ذخیره کردن ندارند)، دو یا بیش از دو واحد ریاضی اعداد صحیح، دو یا بیش از دو واحد ممیز شناور، و معمولاً نوع خاصی از یک واحد SIMD. منطق آغاز دستورالعمل، با خواندن تعداد بسیار زیادی از دستورالعمل ها از حافظه و انتقال آنها به واحد های اجرایی مختلف که در آن لحظه بیکار هستند، پیچیده تر شده است. در آخر، نتایج حاصله جمع آوری و مرتب می شوند.
اجرای خارج از نوبت
اضافه کردن حافظه های نهان، باعث کاهش تعداد و مدت زمان معطلی ها می شود، که دلیل آن کاهش زمان انتظار برای واکشی داده از سلسله مراتب حافظه است. اما این امر به طور کامل موجب برطرف شدن این معطلی ها نمی شود.
در طراحی های ابتدایی، یک خطای حافظه نهان (به انگلیسی: cache miss) باعث می شد تا کنترل کننده ی کش، پردازنده را وادار به توقف و انتظار کند. البته ممکن است دستورالعمل های دیگری در برنامه وجود داشته باشند که داده ی آنها در آن لحظه، در کش موجود باشد. اجرای خارج از نوبت، این امکان را فراهم میکند که دستورالعمل های آماده در زمانی که یک دستورالعمل قبلی برای کش منتظر است، پردازش شود و سپس، نتایج حاصل را مرتب می کند و طوری به نظر می رسد که همه چیز به ترتیب برنامه نویسی شده اجرا شده است. این تکنیک همچنین برای پیشگیری از سایر معطلی های ناشی از وابستگی عملوند ها استفاده شد، مثلاً زمانی که یک دستورالعمل، منتظر نتیجه ی حاصل از یک عملیات ممیز شناور طولانی و یا منتظر سایر عملیات چند چرخه ای است.
تغییر نام رجیستر
هدف از تکنیک موسوم به تغییر نام رجیستر این است که، از اجرای بیهوده ی دستورالعمل های برنامه به شکل متوالی به دلیل استفاده ی مجدد از همان رجیستر ها توسط همان دستورالعمل ها اجتناب شود. فرض کنید که دو گروه از دستورالعملها داریم که از رجیستر مشابهی استفاده می کنند. یک مجموعه از دستورالعمل ها ابتدا اجرا می شوند و رجیستر را برای استفاده توسط مجموعه ی دیگر آزاد می کنند، اما اگر مجموعه دیگر، به یک رجیستر مشابه دیگر اختصاص داده شده باشد، آنگاه هر دو مجموعه ی دستورالعمل می توانند به صورت موازی یا به صورت متوالی اجرا شوند.
چند فرایندی و چند ریسمانی
رشد ناسازگاری بین فرکانس های اجرایی پردازنده و زمان های دسترسی به DRAM، مانعی بر سر راه معماران کامپیوتر شده است. هیچکدام از تکنیک هایی که از روش موازی گرایی در سطح دستورالعمل در داخل یک برنامه بهره گیری می کنند، نمیتوانند مشکل معطلی طولانی مدت را که ناشی از زمان لازم برای واکشی داده از حافظه اصلی است برطرف کنند. علاوه بر این، تعداد زیاد ترانزیستور ها و فرکانس های اجرایی بالا که برای تکنیک های موازی گرایی پیشرفته تر در سطح دستورالعمل لازم است، موجب ایجاد گرمای بیشتر می شود، که دیگر قابل خنک کردن با روش های ارزان نیست. به این دلایل، نسل های جدید کامپیوتر شروع به بهره گیری از سطوح بالاتری از موازی گرایی کردند که خارج از یک برنامه منفرد یا ریسمان برنامه است. این روش را گاهی رایانش بازدهی می نامند. این ایده از بازار رایانه های بزرگ نشات گرفت که برای پردازش های تراکنش آنلاین در آن ها، نه تنها سرعت اجرای یک تراکنش اهمیت داشت، بلکه قابلیت پاسخ دهی به تعداد بسیار زیادی از تراکنش ها هم اهمیت داشت. از آنجایی که عملیات مبتنی بر تراکنش، نظیر مسیریابی شبکه و خدمات دهی وبسایت، به میزان زیادی در دهه گذشته افزایش پیدا کرده است، لذا، صنعت کامپیوتر مجدداً روی ظرفیت و مشکلات بازدهی متمرکز شده است.
یک روش برای دستیابی به این موازی گرایی، استفاده از سیستم های چند پردازنده ای است، یعنی سیستم های کامپیوتری که دارای چندین پردازنده هستند. سرور های چند پردازنده ای کوچک-مقیاس (۲ تا ۸)، که زمانی فقط در رایانه های بزرگ و ابررایانه ها وجود داشتند، هم اکنون به وفور، در بازار کسب و کارهای کوچک وجود دارند. در شرکت های بزرگ، چند پردازنده های بزرگ-مقیاس (۱۶ تا ۲۵۶) رایج هستند. حتی کامپیوترهای شخصی با چندین پردازنده، از دهه ۱۹۹۰، ظهور یافتند.
با کاهش بیشتر اندازه ترانزیستور که مرهون پیشرفت تکنولوژی نیمه هادی بوده است، پردازنده های چند هسته ای که در آن چندین پردازنده روی یک چیپ سیلیکونی پیاده سازی می شوند، ظاهر شدند و در ابتدا در بازار چیپ های نهفته استفاده شدند، که در آن پردازنده های ساده تر و کوچکتر، این امکان را فراهم می آوردند تا تعداد زیادی را بتوان روی یک قطعه از سیلیکون پیاده سازی کرد. در سال ۲۰۰۵، فناوری نیمه هادی این امکان را فراهم آورد تا چیپ های پردازندههای رومیزی دوگانه ی پیشرفته، در حجم بالایی تولید شوند. برخی طراحی ها، نظیر UltraSPARC T1 از شرکت Sun Microsystems، به طراحی های ساده تر (اسکالر، in-order) برگشتند تا بتوانند پردازنده های بیشتری را روی یک قطعه از سیلیکون جا دهند. تکنیک دیگری که اخیراً رایجتر شده است، چند ریسمانی است. در تکنیک چند ریسمانی، زمانی که پردازنده مجبور است تا داده ها را از حافظه ی کند سیستم واکشی کند، به جای معطل ماندن برای رسیدن این داده، به سراغ برنامه ی دیگر یا ریسمان دیگری میرود که آماده اجرا است. اگرچه این روش موجب افزایش سرعت یک برنامه/ریسمان خاص نمیشود، اما باعث افزایش بازدهی کلی سیستم، از طریق کاهش زمان بیکاری پردازنده می شود.
به طور مفهومی، چند ریسمانی معادل است با تعویض زمینه در سطح سیستم عامل. تفاوت در این است که یک پردازنده ی چند هسته ای می تواند یک تعویض ریسمان را در یک چرخه ی پردازنده انجام دهد، در حالیکه یک تعویض زمینه، به طور معمول نیازمند صدها یا هزاران چرخه ی پردازنده است. این کار از طریق افزایش تعداد سختافزار وضعیت (مثلاً فایل رجیستر و شمارنده ی برنامه) برای هر ریسمان فعال انجام می شود. ارتقای بیشتر در این زمینه از طریق چند ریسمانی همزمان انجام می شود. این تکنیک این امکان را فراهم میکند تا پردازندههای سوپر اسکالر، دستورالعمل هایی را از چندین برنامه/ریسمان، به طور همزمان در یک چرخه اجرا کنند.
منابع
- Curriculum Guidelines for Undergraduate Degree Programs in Computer Engineering (PDF). Association for Computing Machinery. 2004. p. 60.
Comments on Computer Architecture and Organization: Computer architecture is a key component of computer engineering and the practicing computer engineer should have a practical understanding of this topic...
- Murdocca, Miles; Heuring, Vincent (2007). Computer Architecture and Organization, An Integrated Approach. Wiley. p. 151. ISBN 9780471733881.
- Clements, Alan. Principles of Computer Hardware (4th ed.). pp. 1&ndash, 2.
- Flynn, Michael J. (2007). "An Introduction to Architecture and Machines". Computer Architecture Pipelined and Parallel Processor Design. Jones and Bartlett. pp. 1&ndash, 3. ISBN 9780867202045.
- Hennessy, John L.; Patterson, David A. (2006). Computer Architecture: A Quantitative Approach (4th ed.). Morgan Kaufmann. ISBN 0-12-370490-1.
- Wilkes, M. V. (1969). "The Growth of Interest in Microprogramming: A Literature Survey". ACM Computing Surveys. 1 (3): 139–145. doi:10.1145/356551.356553. S2CID 10673679.
مشارکتکنندگان ویکیپدیا. «Microarchitecture». در دانشنامهٔ ویکیپدیای انگلیسی، بازبینیشده در ۱۱ آوریل ۲۰۲۱.