رفتن به مطلب

طرز کار یک پردازنده CPU


هامش
 اشتراک گذاری

Recommended Posts

طرز کار یک پردازنده CPU

با اینکه تمام پردازنده ها دارای قسمتهای داخلی متفاوتی نسبت به یکدیگر هستند ولی اصول کار همه ی آنها تقریبا یکی است و از یک اصل طبعیت میکنند که در این آموزش به شرح آن می پردازیم. از آنجاییکه ما به معماری عمومی یک پردازنده می پردازیم شما تا حدودی با تفاوتهای موجود در پردازنده های اینتل و AMD آشنا خواهید شد. یک سی پی یو که به آن میکروپروسسور یا پروسسور هم گفته میشود وظیفه پردازش دیتا را به عهده دارد و چگونگی پردازش به خود برنامه بستگی دارد که میتواند یک بازی، برنامه صفحه گسترده وبا پردازشگر ورد باشد. ولی درکل چون پردازنده هیچ درکی از نوع برنامه در حال پردازش ندارد که چیست و چکاری انجام میدهد، هیچ فرقی برای آن نمیکند. پردازنده فقط دستوراتیکه در برنامه قرار دارند و به آنها Command یا Instruction هم گفته میشود را اجرا میکند. این دستور میتواند دستور جمع دو عدد ویا دستور ارسال دیتا به کارت گرافیک باشد.

زمانیکه شما برای اجرای یک برنامه روی ایکون آن دابل کلیک میکنید اتفاقی که می افتد به شرح زیر است:

1- برنامه ذخیره شده روی هارد (که مجموعه ای از دستورالعمل هاست) از هارد به رم منتقل میشوند.

2- پردازنده، برنامه ی ذخیره شده در رم را از طریق مموری کنترلر لود میکند.

3- دیتایی که حالا در پردازنده قرار گرفته پردازش میشود.

4- عمل بعدی که انجام میشود به خود برنامه بستگی دارد، ممکن است بازهم دیتای بعدی را لود کند ویا روی دیتای لود شده کاری انجام دهد.

post-55-014898700 1281979521_thumb.jpeg

Figure 1: How stored data is transferred to the CPU

در گذشته وظیفه کنترل دیتای ترنسفر شده بین هارد و رم برعهده ی پردازنده بود اما ازآنجاییکه سرعت انتقال دیتا از هارد پایین است، تا زمانیکه دیتا از هارد به رم منتقل شود پردازنده را مشغول نگه میداشت که به این روش PIO یا Processor I/O یا Programmed I/O گفته میشود. اما امروزه دیگر از این روش برای انتقال دیتا استفاده نمیشود و در انتقال دیتا از هارد به رم، پردازنده دیگر نقشی ندارد. به این روش Bus Mastering یا DMA (Direct Memory Access) گفته میشود. در Fig1 چیپ پل شمالی را برای سادگی، بین رم و هارد قرار ندادیم ولی واسطه ی بین ایندو نیز پل شمالی است.

پردازنده های AMD با سوکت 754، 939، 940 و ... دارای یک مموری کنترلر داخلی هستند بهمین دلیل این پردازنده ها بدون دخالت پل شمالی که در Fig1 مشاهده میکنید میتوانند به رم سیستم بصورت مستقیم دسترسی پیدا کنند.

Clock

کلاک در واقع سیگنالی است که برای هماهنگ کردن کارها درداخل کامپیوتر مورد استفاده قرار میگیرد. در شکل 2 یک کلاک سیگنال معمولی نشان داده شده که یک موج مربعی است و با یک نسبت ثابتی از 0 به 1 تغییر حالت میدهد. در این شکل سه سیکل کامل کلاک (تیک) وجود دارد. شروع هر سیکل زمانیست که کلاک میخواهد از صفر به یک تغییر حالت دهد و در شکل با یک فلش مشخص شده. کلاک سیگنال با واحدی بنام هرتز (Hz) که بمعنای تعداد سیکل در ثانیه است اندازه گیری میشود. مثلا یک کلاک 100 MHz بمعنای وجود 100 میلیون سیکل کامل در یک ثانیه است.

post-55-000453400 1281979603_thumb.gif

Figure 2: Clock signal

در کامپیوتر تمامی زمانبندی ها (Timing) برحسب سیکل کلاک یا Clock Cycle اندازه گیری میشوند. مثلا یک رم با تاخیر 5 بمعنای آن است که 5 سیکل کامل از کلاک باید بگذرد تا دیتای درخواست شده از رم تحویل داده شود. در یک پردازنده هم اجرای کامل هر دستورالعمل با یک تاخیر باندازه ی چند سیکل کلاک انجام میشود. مثلا نوعی دستور در پردازنده وجود دارد که بعد از هفت سیکل کلاک اجرای آن به اتمام میرسد. نکته ی جالب در مورد پردازنده ها این است که هر پردازنده ای خود میداند که اجرای هر دستور چند سیکل کلاک طول میکشد چون در هر پردازنده جدولی برای این منظور وجود دارد که تمامی این اطلاعات در آن وجود دارد. مثلا اگر دو دستور برای اجرا وجود داشته باشد و پروسسور بداند که اجرای دستور اول هفت سیکل کلاک طول میکشد، دستور دوم را در هشتمین کلاک اجرا میکند. البته این فقط یک توضیح کلی از اصول کار پردازنده هایی با یک واحد اجرایی است. در پردازنده های مدرن امروزی چند واحد اجرایی وجود دارد که بصورت پارالل کار میکنند و این امکان را به پروسسور میدهند تا دستور بعدی را نیز همزمان با دستور قبلی بصورت موازی اجرا کنند. به این معماری، معماری SuperScalar گفته میشود که بعدا مفصلا درمورد آن توضیح داده خواهد شد.

پس کلاک پردازنده چه تاثیری در کارایی دارد؟

این طرز فکر که کلاک پردازنده مشخص کننده ی کارایی آن است تفسیر اشتباهی است که اکثرا از کارایی دارند. زمانیکه دو پردازنده مثل هم را با یکدیگر مقایسه میکنید، پردازنده ای که فرکانس کلاک آن بیشتر است کارایی بیشتری دارد چون با بالا رفتن فرکانس، T یا دوره پریود هر سیکل کلاک کوتاهتر شده و پروسه ی اجرا در پردازنده کوتاهتر میشود. ولی زمانیکه دو پردازنده متفاوت (با میکرومعماری متفاوت) را باهم مقایسه میکنید، این تفسیر کاملا درست نخواهد بود.

همانطوریکه پیشتر گفته شد، هر دستورالعمل در پردازنده تا اجرای کامل نیاز به گذشت چند سیکل کلاک دارد. مثلا اگر فرض کنیم که پردازنده A یک دستور را در هفت سیکل کلاک اجرا میکند و پردازنده B همان دستور را در پنج سیکل کلاک (در فرکانس یکسان)، پردازنده B سریعترخواهد بود چون در مدت زمان کمتری دستور را پردازش میکند. در پردازنده های مدرن امروزی بدلیل وجود واحدهای اجرایی بیشتر، حافظه های نهان با اندازه های متفاوت، روشهای متفاوت ترنسفر دیتا در داخل پردازنده، روشهای متفاوت پردازش دستورات در واحدهای اجرایی، داشتن Clock rate متفاوت برای ارتباط با بیرون و ... کارایی مفهوم تازه ای پیدا کرده و فاکتورهای دخیل در این مسئله متفاوت از گذشته است.

با بالا رفتن کلاک پردازنده اولین مشکل خود را به اینصورت نشان داد که بخشهای مختلف مادربورد نمیتوانستند با این فرکانس کار کنند. در شکل زیر پشت یک مادربورد، مسیرهای ارتباطی که به آنها Track یا Path گفته میشود و قسمتهای مختلف یک مادربورد را به یکدیگر ارتباط میدهند نشان داده شده است. مشکل اینجاست که با بالا رفتن فرکانس، این ترکها دیگر نقش یک مسیر ارتباطی را بازی نمیکنند و تبدیل به آنتن میشوند. در نتیجه بجای رساندن سیگنال به انتهای مسیر، آنرا بصورت امواج رادیویی از بین میبرند.

post-55-057378800 1281979671_thumb.jpeg

Figure 3: The wires on the motherboard can work as antennas

ترجمه: Delphianrex

منبع: Hardwaresecrets.com

لینک به دیدگاه
Share on other sites

External Clock

همین مشکل باعث شد تا تولید کنندگان به فکر ایجاد مفهوم جدیدی بنام ضرب کلاک یا Clock Multiplication بیافتند که از پردازنده های 486DX2 این ایده پیاده سازی شد. برهمین اساس از آن زمان تاکنون تمام پردازنده های موجود دارای یک کلاک خارجی و یک کلاک داخلی هستند. کلاک خارجی همان سرعتی است که پردازنده با استفاده از چیپ پل شمالی برای نقل و انتقال دیتا از/به رماستفاده میکند و کلاک داخلی هم همان کلاکی است که بخشهای داخلی پردازنده برآن اساس کار میکنند. بعنوان مثال در یک پردازنده 3.4GHz پنتیوم 4، "3.4" به کلاک داخلی پردازنده اشاره میکند که از ضرب 17 در 200MHz که کلاک خارجی آن است بدست می آید.

post-55-089173800 1281979971_thumb.jpg

Figure 4: Internal and external clocks on a Pentium 4 3.4 GHz

در پردازنده های امروزی، تفاوت فاحش بین کلاک داخلی و خارجی آنها بزرگترین مشکلی است که برای بالا بردن کارایی باید حل شود. بعنوان مثال در همین پردازنده ی 3.4GHz، زمانیکه پردازنده قصد خواندن دیتا از رم را دارد باید کلاک خود را تقسیم بر 17 کند تا با سرعت کلاک رم با آن ارتباط برقرار کند بطوریکه انگار یک پردازنده ی 200 مگاهرتزی است. در طراحی پردازنده از روشهای مختلفی برای به حداقل رساندن تاثیر این تفاوت کلاک استفاده میشود. استفاده از حافظه نهان یا Cache در داخل پردازنده و انتقال بیش از یک بسته دیتا از رم، دو روش معمول برای حل این مشکل هستند. در پردازنده های AMD دو، و در پردازنده های Intel چهار بسته ی دیتا از رم ارسال میشود.

post-55-006466100 1281980103_thumb.gif

Figure 5: Transferring more than one data per clock cycle

به همین دلیل همیشه سرعت کلاک خارجی پردازنده های AMD دوبرابر مقدار واقعیشان و پردازنده های Intel چهار برابر مقدار واقعیشان عنوان میشود. مثلا اگر کلاک خارجی پردازنده های AMD 200مگاهرتز باشد، کلاک خارجی آنها 400مگاهرتز و کلاک خارجی پردازنده های Intel 800مگاهرتز در نظر گرفته میشود. به تکنیک انتقال دو بسته دیتا DDR (Double Data Rate) و تکنیک انتقال چهار بسته QDR (Quad Data Rate) گفته میشود.

بلوک دیاگرام یک CPU

در شکل زیر بلوک دیاگرام یک پردازنده ی مدرن را مشاهده میکنید (در معماری پردازنده های AMD و Intel تفاوتهای زیادی وجود دارد و شکل زیر فقط یک طرح کلی از یک پردازنده است).

post-55-033965900 1281980191_thumb.gif

Figure 6: Basic block diagram of a CPU

توجه کنید که بدنه ی پردازنده فقط همان قسمتی است که با خط چین از رم جدا شده است. پهنای باند مسیر داده ی مابین رم و پردازنده معمولا 64 بیت است که با همان سرعت کلاک رم یا کلاک خارجی پردازنده کار میکند. با ترکیب پهنای باند و کلاک رم میتوان Transfer Rate یا نرخ انتقال داده رم را بدست آورد. برای این منظور کافیست سرعت کلاک را در پهنای باند ضرب کرده و بر 8 تقسیم کنید تا نرخ انتقال برحسب مگابایت بدست آید. مثلا در یک سیستم با رم DDR400 در حالت تک کاناله نرخ انتقال داده 3200 مگابایت در ثانیه است در حالیکه یک رم با همین فرکانس در حالت دوکاناله (128Bit) نرخ انتقالی معادل 6400 مگابایت دارد. تمام قسمتهای داخل خط چین با سرعت کلاک داخلی پردازنده کار میکنند (بسته به نوع پردازنده ممکن است بعضی قسمتها با سرعتی بالاتر از کلاک داخلی کار کنند ویا ممکن است پهنای باند قسمتهای مختلف در آنها 64 بیت ویا 128 بیت باشند). مثلا در پردازنده های مدرن امروزی مسیر بین کش سطح 2 و کش دستورالعمل سطح 1، 256 بیت است. بنابراین هرچه بیتهای بیشتری در هر سیکل کلاک منتقل شوند، انتقال داده با سرعت بیشتری انجام خواهد شد. در شکل بالا از یک فلش قرمز بین رم و کش سطح 2، و از یک فلش سبز در مابقی قسمتها برای نشان دادن نرخ کلاک و پهنای باند متفاوت استفاده شده است.

ترجمه: Delphianrex

منبع: Hardwaresecrets.com

لینک به دیدگاه
Share on other sites

Memory Cache

مموری کش نوعی حافظه ی بسیار سریع است که به آن حافظه ی نوع استاتیک یا SRAM هم گفته میشود. حافظه هایی که در حال حاضر بعنوان رم کامپیوتر مورد استفاده قرار میگیرند حافظه های نوع دینامیک یا DRAM هستند. حافظه های نوع استاتیک معمولا مصرف برق بالاتر، حجم و اندازه ی بیشتر و فرکانس کاری بسیار بالاتری (در حد فرکانس کاری خود پردازنده) در قیاس با حافظه های دینامیک دارند که همین مسئله باعث افزایش چشمگیر قیمت آنها شده است. همانطور که پیشتر گفته شد، زمانیکه پردازنده مجبور به درخواست داده ی مورد نظر از خارج (رم) شود که به این پروسه Fetch کردن گفته میشود، مجبور به پایین آوردن فرکانس خود میشود که یکی از راه حلهای پایین آوردن این نوع درخواستها استفاده از حافظه ی کش در پروسسور است. زمانیکه پردازنده قسمتی از یک بلوک داده را از رم لود میکند، مداری بنام مموری کش کنترلر یک بلوک پایینتر از بلوک درخواستی CPU را هم در کش لود میکند. از آنجاییکه معمولا دستورات یک برنامه بصورت ترتیبی اجرا میشوند، دستور بعدی که باید اجرا شود همان بلوک بعد از بلوک لود شده خواهد بود. بهمین دلیل دیگر پردازنده مجبور نیست زمان اضافی را برای لود دیتای بعدی صرف کند، چون بلوک دیتای بعدی قبلا لود شده و در کش پردازنده قرار دارد و پردازنده میتواند با همان سرعت کلاک داخلی خود به آن دسترسی پیدا کند. کش کنترلر همیشه دیتای درحال لود را زیر نظر میگیرد تا چند بلوک بعد از دیتای در حال بارگزاری را نیز لود کند.مثلا اگر پردازنده در حال لود دیتایی از آدرس 1000 باشد، کش کنترلر دیتای موجود تا n آدرس بعد از آنرا نیز لود میکند (منظور از n صفحات حافظه است). مثلا اگر پردازنده با حافظه بصورت صفحات 4 کیلوبایتی کار کند، دیتای موجود در 4096 آدرس بعد از آنرا نیز لود میکند (منظور همان آدرس 1000 است).

post-55-040724500 1281980434_thumb.jpg

Figure 7: How the memory cache controller works

در نتیجه هرچه اندازه ی کش پردازنده بیشتر باشد دیتای بیشتری در آن لود شده و تعداد دفعات مراجعه ی پردازنده به رم کاهش میابد و در نتیجه در افزایش کارایی پردازنده تاثیر بسزایی خواهد داشت. اگر پردازنده موفق به یافتن دیتای مورد نیاز در کش شود میگوییم یک "Cache Hit" و در مواقعی که موفق به یافتن آن نمیشود و مجبور به لود آن از رم میشود میگوییم یک "Cache Miss" داشته است. منظور از L1 و L2 بترتیب سطح 1 و سطح 2 است که به فاصله ای که از هسته ی پردازنده (واحد اجرایی) دارند اشاره میکند.

در اینجا ممکن است سوالی در ذهن شما بوجود بیاید که چرا سه سطح کش (کش دیتای L1، کش دستورالعمل L1 و کش سطح 2) در یک پردازنده وجود دارد. اگر به شکل 6 توجه کنید متوجه میشوید که کش دستورالعمل سطح 1 کش ورودی و کش دیتای سطح 1 هم بعنوان کش خروجی عمل میکند که معمولا کش دستورالعمل کوچکتر از کش سطح 2 است. این کش معمولا زمانی نقش اصلی خود را در کارایی بازی میکند که برنامه بخواهد یک دستور از برنامه را وارد حلقه کند تا تکرار شود چون دستور مورد نظر به Fetch Unit نزدیکتر خواهد بود.

Branching

تا به الان مکرار به کاهش کارایی در زمانیکه تعداد Cache missها بالاتر میرود اشاره کردیم و گفتیم با استفاده از حافظه ی کش داخل پردازنده میتوان تا حد زیادی این مشکل را مرتفع کرد. ولی این روش تنها تا زمانیکه پرش (Branch) در برنامه وجود نداشته باشد کارایی خود را حفظ میکند. اگر در برنامه از دستور پرشی مثل Jump یا go to استفاده شده باشد، باعث پرش برنامه به قسمتی غیر قابل پیشبینی از حافظه میشود که قبلا در کش پردازنده لود نشده و پردازنده مجبور به Fetch کردن آن از حافظه میشود. برای حل این مشکل در پردازنده های مدرن، کش کنترلر دستورات لود شده در کش را بررسی میکند و به محض رسیدن به دستور jump قبل از اینکه پردازنده به آن دستور برسد آدرسی را که این دستور به آن اشاره میکند را هم در کش L2 لود میکند.

post-55-054221700 1281980483_thumb.jpg

Figure 8: Unconditional branching situation

تا اینجا مشکل جدی غیر قابل حلی بوجود نیامد. مشکل اصلی زمانی بوجود میاید که دستور پرش از نوع شرطی باشد. بعنوان مثال آدرسیکه قرار است برنامه به آن مراجعه کند به جواب شرطی بستگی داشته باشد که هنوز جواب آن مشخص نشده است. مثلا اگر a=<b برو به آدرس 1 و اگر a>b برو به آدرس2 (شکل 9). از آنجاییکه هنوز مقدار a و b هنوز مشخص نشده است باعث بوجود آمدن یک Cache Miss میشود در پردازنده میشود. برای حل این مشکل کش کنترلر هر دو شرط را در کش لود میکند و زمانیکه پردازنده به دستور شرط رسید، آن آدرسیکه انتخاب نشد را از حافظه خارج میکند (چون لود دیتای غیر ضروری بهتر از دسترسی مستقیم به حافظه است).

post-55-082510700 1281980527_thumb.jpg

Figure 9: Conditional branching situation

ترجمه: Delphianrex

منبع: Hardwaresecrets.com

لینک به دیدگاه
Share on other sites

Processing Instructions

همانطور که قبلتر اشاره شد وظیفه ی Fetch Unit لود کردن دستورات از مموری است. برای اینکار ابتدا در L1 Instruction Cache بدنبال دستور مورد نظر پردازنده میگردد، درصورتیکه این دستور در آنجا نباشد بسراغ L2 Memory Cache میرود و در نهایت اگر دستور مورد نظر در آنجا هم یافت نشود مجبور به لود مستقیم دستور از حافظه و با سرعت بسیار پایین میشود. البته زمانیکه شما سیستم خود را روشن میکنید تمام کش ها خالی هستند ولی همزمان با لود سیستم عامل، CPU شروع به پردازش دستورات اولیه لود شده از هارد میکند و کش کنترلر هم شروع به لود کش ها میکند. بعد از آنکه Fetch Unit دستورات موردنیاز پردازنده را بدست آورد آنها را به دیکد یونیت ارسال میکند.

در Decode Unit دستورات مورد بررسی قرار میگیرند و عملی که قرار است انجام دهند مشخص میشود. برای اینکار از یک حافظه رام بنام Microcode که در پردازنده قرار دارد کمک میگیرد. لازم به ذکر است که هر دستوری که برای پردازنده قابل فهم است، میکروکد مربوط به خود را دارد. در حقیقت میکروکد مثل یک راهنمای قدم به قدم برای اجرای هردستوربرای پردازنده عمل میکند. مثلا اگر دستور لود شده در پردازنده دستور جمع a+b باشد، میکروکد مربوط به آن به دیکد یونیت میگوید که برای انجام اینکار به دو پارامترa و b نیاز است. سپس دیکد یونیت به Fetch Unit درخواست لود دیتا از قسمتهای بعدی حافظه را که a و b در آن قرار دارند را میدهد. بعد از انکه دیکد یونیت دستور مورد نظر را ترجمه و پارامترهای مورد نیاز برای اجرای آنرا محیا کرد، راهنمای کامل اجرای آنرا بهمراه دیتای مورد نیاز آن برای واحد اجرایی ارسال میکند. در نهایت واحد اجرایی دستور مورد نظر را اجرا میکند. در پردازنده های مدرن امروزی برای بالا بردن کارایی پردازنده از چندین واحد اجرایی استفاده میشود که بصورت پارالل با یکدیگر کار میکنند. بعنوان مثال در یک پردازنده با شش واحد اجرایی میتوان شش دستور را همزمان به اجرا درآورد. بعبارت دیگرمیتوان گفت، بصورت تئوری کارایی یک پردازنده با شش واحد اجرایی مانند شش پردازنده با یک واحد اجرایی خواهد بود که به این نوع معماری، معماری Superscalar گفته میشود.

معمولا در پردازنده های مدرن امروزی از واحدهای اجرایی یکسان استفاده نمیشود بلکه هر واحد اجرایی برای اجرای یک نوع دستور خاص است. مثلا FPU یا Floating Point Unit واحد اجرایی است که وظیفه اجرای دستورات پیچیده ی ریاضی را برعهده دارد. معمولا واحد دیگری نیز بین دیکد یونیت و واحد اجرایی قرار دارد که به آن Dispatch یا Schedule Unit گفته میشود و وظیفه ی آن ارسال دستور به واحد اجرایی مناسب است (مثلا اگر یک دستور از نوع ریاضی باشد آنرا به FPU میفرستد نه به ALU که یک واحد اجرایی Generic است). نهایتا زمانیکه پردازش یک دستور به اتمام رسید، نتیجه ی آن به L1 Data Cache ارسال خواهد شد. اگر همان مثال جمع a + b را در نظر بگیریم، بعد از محاسبه ی مجموع این دو پارامتر، ابتدا جواب به L1 Data Cache وسپس بسته به دستور بعدی ممکن است دوباره به رم، کارت گرافیک ویا جای دیگری ارسال شود.

ویژگی دیگری که مدت زیادی است پردازنده ها از آن بهره میبرند، Pipeline یا خط لوله است. با استفاده از این تکنولوژی میتوان چندین دستور مختلف را در قسمتهای مختلف پردازنده و بصورت همزمان (در حال پردازش) داشت. زمانیکه Fetch Unit دستوری را به Decode Unit ارسال میکند به حالت ایده آل (بیکار) میرود، درست؟ چطور است که کاری کنیم در این حالت بجای بیکار ماندن دستور بعدی را از رم لود کند؟ تا زمانیکه اولین دستور به واحد اجرایی ارسال میشود، Fetch unit میتواند دستور دوم را لود و سپس به دیکد یونیت ارسال کند، سپس دستور سوم و ادامه کار. در پردازنده ای با یک خط لوله ی 11 سکویی (11-Stage pipeline) ، سکو نام دیگر واحدهای داخلی پردازنده است، میتوان 11 دستورالعمل را بصورت همزمان و در حال پردازش داشت. در حقیقت در پردازنده های مدرن که از معماری سوپراسکالراستفاده میکنند ممکن است تعداد دستورالعملها بیشتر هم باشد. با توجه به این مطلب میتوان دریافت که یک دستور تا اجرای کامل باید از 11 مرحله عبور کند پس هرچه تعداد سکوها در خط لوله بیشتر باشد، اجرای کامل دستور با تاخیر بیشتری انجام میشود. از طرف دیگر این نکته را نیز در نظر داشته باشید که هرچه این سکوها بیشتر باشند تعداد دستورالعملهایی که بطور همزمان در حال اجرا هستند نیز بیشتر خواهد بود (بعبارت دیگر زمانیکه اولین دستور لود شد، بعد از عبور از 11 سکو بصورت کامل اجرا شده است و به محض اتمام اجرای آن، اجرای دستور بعدی نیز تمام خواهد شد و دیگر لازم نیست که 11 سکوی دیگر را نیز تا اجرای کامل دستور منتظر بماند). در پردازنده های جدید از تکنیکهای دیگری نیز برای افزایش کارایی استفاده میشود که ما فقط به دومورد از آنها اشاره خواهیم کرد.

- (Out Of Order Execution (OOO

Speculative Execution-

(Out-Of-Order Execution (OOO

پیشتر گفته شد که در پردازنده های مدرن امروزی از چند واحد اجرایی استفاده میشود که بصورت پارالل کار میکنند. این واحدهای اجرایی وظایف مختلفی را برعهده دارند مثلا ALU یک واحد اجرایی عمومی (عمل شیفت، منطقی و ...) و FPU یک واحد اجرایی برای اعمال ریاضی است. در اینجا برای فهم راحت تر فرض میکنیم پردازنده ای که با آن کار میکنیم دارای 6 واحد اجرایی است، 2 واحد FPU و 4 واحد ALU. فرض کنید دستورات زیر برای اجرا به پردازنده ارسال شده اند.

1. generic instruction
2. generic instruction
3. generic instruction
4. generic instruction
5. generic instruction
6. generic instruction
7. math instruction
8. generic instruction
9. generic instruction
10. math instruction 

بنظر شما چه اتفاقی در پردازنده رخ میدهد؟

Dispatch unit چهار دستور اول را به چهار ALU پردازنده ارسال خواهد کرد ولی برای دستور پنجم باید منتظر بماند تا یکی از ALUها خالی شده تا دستور مورد نظر برای ادامه ی پردازش به آن ارسال شود. ولی از آنجا که دو واحد FPU هنوز در حالت ایده آل قرار دارند و پردازشی انجام نمیدهند، این حالت چندان مطلوب نخواهد بود. در پردازنده هایی که از OOO استفاده میکنند (تمام پردازنده های امروزی این قابلیت را دارند) در اینحالت دستورات بعدی را نیز بررسی میکنند که آیا میتوان آنها را به واحدهای ایده ال ارسال کرد یا نه. در این مثال این امکان وجود ندارد چون دستور بعدی نیز از نوع generic است. out-of-order engine همینطور ادامه میدهد تا به دستور هفتم که از نوع ریاضی است برسد. به محض رسیدن به این دستور آنرا به یکی از FPUها ارسال میکند، در این حالت بازهم یکی از FPUها در حالت ایده آل است پس پردازنده باز بدنبال دستور دیگری ازاین نوع خواهد گشت که در این مثال دستور هشتم و نهم را رد میکند و دستور دهم را به FPU برای انجام پردازش ارسال میکند.

از آنجاییکه پردازنده اگر دستور مناسبی را پیدا نکرد، نمیتواند تا آخر بدنبال آن بگردد، معمولا در آنها محدودیتی برای این منظور در نظر گرفته میشود که معمولا 512 دستور است.

Speculative Execution

فرض کنید یکی از دستورات generic یک دستور پرش شرطی باشد. در این حالت out-of-order engine چکاری میتواند انجام دهد؟

اگر پردازنده از speculative execution پشتیبانی کند هردو حالت شرط را اجرا خواهد کرد (دستور سوم). مثال زیر را در نظر داشته باشید:

1. generic instruction
2. generic instruction
3. if a=<b go to instruction 15
4. generic instruction
5. generic instruction
6. generic instruction
7. math instruction
8. generic instruction
9. generic instruction
10. math instruction
…
15. math instruction
16. generic instruction
…

زمانیکه out-of-order engine این دستورات را آنالیز میکند، دستور پانزدهم را وارد یکی از FPU ها میکند وبرای پر کردن FPU دومی باید دستور ریاضی دیگری را نیز پیدا کند در غیر اینصورت FPU دوم در حالت ایده آل باقی خواهد ماند. در این زمان دو دستور همزمان پردازش شده اند. در اینحالت اگر a بزرگتر از b بود، پردازنده از پردازش دستور پانزدهم صرف نظر میکند. ممکن است بگویید که با اینکار زمان بیشتری تلف خواهد شد درصورتیکه بهرحال یکی از FPUها در حالت ایده آل قرار دارد(چه این دستور اجرا شود یا نشود). از طرفی هم اگر a=<b بود، دستور سه که به دستور پانزده نیازمند است، این دستور قبلا پردازش شده و پروسه ی اجرا از دستور شانزدهم سر گرفته میشود و همین باعث افزایش قابل توجه کارایی در پردازنده میشود.

ترجمه: Delphianrex

منبع: Hardwaresecrets.com

لینک به دیدگاه
Share on other sites

مهمان
This topic is now closed to further replies.
 اشتراک گذاری

×
×
  • اضافه کردن...