بخش پيش واكشي در معماري Core™ بدون هيچ ترديدي از آنچه در معماري هاي K8 و NetBrust يافت ميشود برتر است. هر هسته پردازنده اي كه از اين معماري بهره مي برد حداقل سه واحد پيش واكشي (دو واحد براي داده و يك واحد براي دستورالعمل) مختص به خود دارد، دو واحد پيش واكشي ديگر نيز براي كاشه سطح 2 اين پردازنده ها در نظر گرفته شده است. لذا پردازنده هاي دو هسته اي Core2 كه با اين معماري عرضه خواهند شد با 8 واحد «پيش واكشي» مجزا مي توانند از پهناي باند حافظه موجود به صورت موثرتري استفاده كرده و ضريب اطمينان حضور اطلاعات در حافظه كاشه را هنگام اجراي يك دستورالعمل بالا برند.
حافظه كاشه موجود در پردازنده هاي مبتني بر معماري Core نيز در افزايش كارايي آن موثر است. يك حافظه كاشه سطح دو 4 مگابايتي ميان هر دو هسته پردازنده به اشتراك گذاشته شده است و دسترسي به آن در 12 تا 14 سيكل ساعت موثر خواهد بود. حافظه كاشه سطح يک داده و دستورالعمل نيز هر دو تا 32 كيلوبايت با زمان دسترسي 3 سيكل ساعت ارتقا پيدا كردهاند. بايد اضافه كرد حافظه كاشه Trace كه در معماري NetBrust از آن بهره گرفته شده بود، با توجه به خط لوله هاي كوتاه Core كنار گذاشته شده است. اين حافظه اساسا به عنوان يك بافر براي دستورالعمل هاي كدگشايي نشده به كار گرفته مي شد در حالي كه اين واحد براي خط لوله هاي طولاني NetBrust مفيد واقع شده بود ، اينتل تشخيص داده كه طرح سنتي حافظه کاشه سطح يک در اين معماري موثرتر مي باشد.
جدول شماره 1
تنها با يك نگاه سريع به جدول شماره «1» كاملا روشن خواهد شد كه زير سيستم حافظه طراحي شده براي Core™ نسبت به ساير معماري ها موثرتر است، ميزان حافظه كاشه سطح 2 در پردازنده هاي مبتني بر اين معماري دو برابر پردازنده هاي دو هسته اي AMD است، علاوه بر اين با وجود افزايش حجم آن ميانگين تاخير دسترسي به حافظه كاشه سطح 2 حداقل باقي مانده است، اين حافظه اشتراكي، امكان اختصاص يافتن بيش از 2 مگابايت حافظه به هر هسته را فراهم ساخته. هر دو حافظه كاشه سطح 1 و 2 با گذرگاه داخلي 256 بيت با پهناي باند بسيار گسترده اي به هسته پردازنده متصل هستند.
Core در برابر K8 : زيرسيستم حافظه
مهمترين رقيب Core ، معماري K8 دو ويژگي برتر كوچك اما غيرقابل چشم پوشي در زيرسيستم هاي حافظه دارد.
اولين ويژگي حافظه كاشه سطح يک بزرگتر آن است، هر دو بخش دستورالعمل و داده اين حافظه، 64 كيلوبايت گنجايش دارند در حالي كه طراحان Core بر اين بخش ها 32 كيلوبايت در نظر گرفته اند. اين تنها يك برتري كوچك است چرا كه انتظار مي رود حافظه 8 طرفه 32 كيلوبايتي، عملكرد بسيار نزديكي نسبت به حافظه 2 طرفه 64 كيلوبايتي داشته باشد.
برتري دوم و با اهميت تر معماري K8، «كنترلرحافظه» مجتمع در داخل پردازنده است. در كامپيوترهاي مبتني بر اين معماري حافظه اصلي به صورت مستقيم توسط «كنترلر حافظه» داخلي پردازنده مديريت مي شوند، در حالي كه در كامپيوترهاي مبتني بر معماري هاي Intel «كنترلرحافظه» در داخل چيپست «پلشمالي» مادربرد قرار داشته و تعامل پردازنده با حافظه اصلي، از اين طريق صورت مي گيرد. «كنترلرحافظه» مجتمع در داخل پردازنده، دسترسي بي واسطه به حافظه اصلي با تاخير كمتر را به همراه دارد.
تاخير دسترسي به حافظه اصلي در كامپيوترهاي پنتيوم 4 تقريبا دو برابر كامپوترهاي Athlon 64 است (80 الي 90 در برابر 45 الي50 نانوثانيه). با اين وجود مهندسين اينتل در معماري جديد خود راه کارهاي متعددي مانند «آشكارسازي حافظه» براي پنهان كردن اين تاخير از چشمان پردازنده ابداع كردهاند كه در ادامه به آنها اشاره خواهيم كرد.
دو ويژگي برتر مطرح شده در معماري K8 توسط ديگر برتري هاي زير سيستم حافظه معماري Core قابل چشم پوشي هستند، پردازنده هاي مبتني بر معماري Core داراي حافظه كاشه سطح دو گسترده تر و واحدهاي پيش واكشي هوشمندتري نسبت به K8 هستند. حافظه كاشه سطح يک در Core پهناي باندي نزديك به دو برابر پهناي باند K8 ارائه ميكند (اندازه گيري شده با نرم افزار ScienceMark) علاوه بر اين در پيكربندي هاي دو هسته اي نيز حافظه كاشه سطح دو در Core حدود 2.5 برابر سريع تر از آنچه كه معماري K8 در پردازنده هاي Athlon 64 X2 ارائه كرده، عمل مي كند.
كدگشايي هوشمندتر
Core اولين معماري در دنياي پردازنده هاي x86 است كه به 4 واحد كدگشايي x86 تجهيز شده است: 3 «كدگشاي ساده» و يك «كدگشاي پيچيده». وظيفه واحدهاي كدگشايي در تمام پردازنده هاي x86 كنوني تنها ترجمه كردن دستورالعمل هاي ورودي (شامل كدعملگر و آدرس ها) نيست، بلكه ترجمه دستورالعمل ها با طول متغيير 1 الي 15 بيتي به دستورالعمل هاي از پيش تعيين شده با طول ثابت (دستورالعمل هاي RISC) كه زمانبندي و اجراي آنها ساده تر است نيز مي باشد، اينتل نام اين دستورالعمل ها كدگشايي شده را micro-op نهاده است.
در معماري Core، اكثر دستورالعمل ها x86 توسط يكي از سه واحدكدگشايي ساده به يك micro-op ترجمه مي شوند و ساير دستورالعمل هاي سطح بالايي كه حداكثر با چهار micro-op بيان ميشوند، توسط واحد كدگشايي پيچيده كدگشايي ميگردند.
يكي ديگر از نوآوري هاي معماري Core، «همجوشي macro-op» نام دارد، اين ويژگي تركيب دو دستورالعمل وابسته x86 را ممكن ميسازد. به عنوان مثال دستورالعمل مقايسه (CMP) با دستورالعمل پرش (JNE) به كمك اين ويژگي تركيب شده و به يك micro-op كدگشايي ميشود. اين دستورالعمل ها به طور عمومي نتيجه كامپايل عبارات شرطي if، then و else هستند.
تصویر شماره 1
به كمك اين نوآوري، پردازنده هايي كه از معماري Core بهره ميبرند، توانايي كدگشايي پنج دستورالعمل را در هر سيكل ساعت دارند ، با توجه به تصوير شماره (1)، پنج دستورالعمل به صورت هم زمان از صف دستوالعمل ها خوانده شده و در نهايت چهار micro-op كدگشايي ميشود.
به گفته اينتل به طور متوسط در برنامه هاي عمومي كامپيوتر، از ميان هر 10 دستورالعمل استاندارد x86 كه به پردازنده ارسال ميشود دو دستورالعمل قابل ادغام با همديگر هستند و دستورالعمل تركيب شده مسير خطلوله را همانند يك دستورالعمل ساده طي كرده و در پايان خط لوله تاثير مشابه با حالت تركيب نشده بر روي ثباتهاي پردازنده خواهد گذاشت. در صورتي اين ادعاي اينتل صحت داشته باشد، «همجوشي macro-op» حدود 11 درصد افزايش كارايي را به ارمغان خواهد آورد.
ديگر نوآوري اينتل در حوزه كدگشايي معماري اينتل «همجوشي micro-op» نام دارد، هدف نهايي اين ويژگي كه از معماريP-M پردازنده هاي Core Duo به ارث برده شده تركيب micro-opها با يكديگر است. دستورالعمل هاي پيچيده ي اندكي وجود دارند كه پس از كدگشايي به چندين micro-op تبديل مي شوند، در مقابل دستورالعمل هاي ساده متعددي نيز هستند كه نمي توان آنها را با يك micro-op بيان نمود. به عنوان مثال دستور ساده ADD (جمع) در صورتي كه عملوندهايش ثباتهاي پردازنده باشند (مانند ADD EBX,EAX) به سادگي به يك micro-op كدگشايي ميشود اما اگر يكي از عملوندها آدرس خانهاي از حافظه باشد پيچيدگي اين دستور ساده براي پردازنده بسيار زياد مي شود. مانند دستور ADD [mem],EAX كه بر اساس آن مقدار ثبات EAX بايد با مقدار خانه mem حافظه جمع شده و حاصل در خانه mem قرار گيرد.
در معماريهاي ابتدايي مانند آنچه كه در «پنتيوم پرو» به كار برده شده بود، اين نوع دستورالعمل ها به چندين micro-op شكسته ميشد، زيرا واحدهاي محاسباتي پردازنده تنها به ثبات ها دسترسي مستقيم براي محاسبات خود دارند. بنابر اين در بهترين حالت دستورالعمل ADD [mem],EAX به دستورالعملهاي زير شكسته ميشود:
• «بارگذاري» : MOV EBX,[mem]a
• محاسبات منطقي و رياضي : ADD EBX,EAX
• «ذخيرهسازي» : MOV [mem],EBX
«همجوشي micro-op» امكان تركيب دستور «بارگذاري» با دستور محاسباتي را ميسر مي سازد، بنابر به كمك اين ويژگي تنها يك micro-op براي دستورالعمل بالا توسط واحد كدگشايي توليد ميشود. اين امر چندان كار كوچكي نيست چرا كه در طرحهاي قديمي كنارهم قرار دادن عملگرهاي محاسباتي با «بارگذاري» موجب طولاني شدن خطلوله و پايين آمدن حداكثر فركانس كاري پردازنده ميشد. در معماري نوين اينتل با استفاده از مدارهاي بزرگ و هوشمندتر كه به صورت همزمان چندين «همجوشي micro-op» انجام ميدهند، اين امر بدون اعمال محدوديت قابل ملاحظه ممكن گشته است.
Core در برابر K8 : كدگشايي
به نظر شما چگونه سه واحد «كدگشايي ساده» به اضافه يك واحد «كدگشايي پيچيده» در معماري Core با سه واحد «كدگشايي پيچيده» موجود در معماري K8 رقابت ميكند؟
معماري ابتدايي پردازنده هاي Athlon (معماري K7) دو شيوه كدگشايي «مسير برداري» و «مسير مستقيم» داشت. كدگشايي «مسير برداري» يك دستورالعمل منجر به چندين دستورالعمل شبه RISC شده (كه AMD آنها را macro-op نام نهاده) و كدگشايي «مسير مستقيم» منجر به يك macro-op مي شود هر يك از واحدهاي كدگشايي در K7 داراي توانايي كدگشايي به دو شيوه مذكور بودند. اما از ديدگاه عملكرد، كدگشايي «مسير مستقيم» به دليل داشتن تعداد macro-op كمتر ترجيح داده ميشد. اگر از اين كه ما معماري منسوخ شده K7 را تحليل مي کنیم شگفت زده شده ايد بايد اضافه كنيم كه معماري K8 به طور گسترده اي بر پايه معماري K7 طراحي گشته است.
هر سه واحد «كدگشايي پيچيده» K7 قادر به كدگشايي «مسير مستقيم» اكثريت دستورالعمل هاي x86 ميباشد و بخش اندكي از دستورالعمل ها به شيوه «مسير برداري» كدگشايي مي گردند. با اين وجود برخي از دستورالعمل هاي مميزشناور و SSE مي بايست به شيوه زمان بر «مسير برداري» كدگشايي مي شدند. در معماري K8 از واحدهاي «كدگشايي پيچيده» قدرتمندتري بهره برده شد كه توانايي كدگشايي تمامي دستورالعمل هاي SSE و مميزشناور را به شيوه «مسير مستقيم» دارا مي باشد.
مشابه ويژگي «همجوشي macro-op» اينتل در معماري K8 شركت AMD وجود ندارد همچنين مي توان فرم ديگري از «همجوشي micro-op» را در اين معماري يافت، براي اينكه پيچيدگي اين مقايسه ها موجب سردرگمي شما نشود در جدول 2 تفاوت هاي موجود را ترسيم كردهايم :
جدول شماره 2
در پردازنده هاي Athlon ويژگي «همجوشي micro-op» وجود دارد، يك دستورالعمل مشابه دستورالعمل ADD [mem],EAX در گذر از خط لوله پردازنده تنها با يك macro-op بيان ميشود. دستورالعمل هاي «بارگذاري» و SSE نيز در معماري Core قابل تركيب با يكديگر هستند اما اين امكان براي K8 در نظر گرفته نشده و دستورالعمل هاي SSE توسط دو macro-op مجزا اجرا مي شوند.
با توجه به اين توضيحات به نظر شما واحدهاي كدگشايي Core چگونه با K8 رقابت مي كنند؟ شايد بدون دسترسي به اطلاعات بيشتر در مورد ساير بهينه سازي هاي Core در واحد كدگشايي، نتيجهگيري كمي دشوار باشد، با اين وجود بر اساس مفروضات ميتوان ايده كلي مقايسه را مطرح كرد. در اكثر وضعيت هاي موجود معماري Core برتري نسبي در اين بخش دارد، اين معماري مي تواند در هر سيكل ساعت خود 4 تا 5 دستورالعمل x86 (به لطف «همجوشي macro-op» ) را كدگشايي و به داخل خط لوله هدايت كند در حالي كه K8 در هر سيكل ساعت تنها 3 دستورالعمل را كدگشايي ميکند.
وضعيت هايي كه 3 واحد «كدگشايي پيچيده» K8 از 3 واحد «كدگشايي ساده» و يك واحد پيچيده ي Core پيشي مي گيرند بسيار اندك است. اين اتفاق زماني رخ خواهد داد كه پيچيدگي هر سه دستورالعمل واكشي شده از صف دستورالعمل ها در حدي باشد كه توسط واحدهاي «كدگشايي ساده» تعبيه شده در Core نتوان آنها را به micro-op تبديل كرد.
دسترسي هوشمندانه به حافظه
از زمان «پنتيوم پرو»، پردازنده هاي x86 توانايي اجراي دستورالعمل ها، خارج از نوبت را پيدا كردند. با اين حال به طور ميانگين يك سوم دستورالعملها به سادگي قابليت اجراي خارج از نوبت را ندارند، اين دستورالعملها همگي از نوع «بارگذاري» هستند، جلو انداختن دستورالعملهاي «بارگذاري» افزايش عملكرد چشمگيري نسبت به بارگذاري دادهها در زماني كه به آنها نياز داريد خواهد داشت. با اين كار تاخيرهاي متعدد حافظه كاشه سطح 1 و سطح 2 از چشمان پردازنده پهنان خواهند ماند.
تصور اين افزايش كارايي بسيار ساده است، فرض كنيد يك دستورالعمل ALU در اختيار داريد كه نياز به بخش مشخصي از داده هاي ذخيره شده در حافظه را دارد اما اين بخش داده در حافظه كاشه سطح 1 موجود نباشد، در اين صورت پردازنده هنگام آغاز محاسبات بايد در انتظار دريافت دادههاي مذكور بماند. اگر عمليات «بارگذاري» چندين سيكل قبل از زماني كه ALU به آن بخش داده نياز دارد آغاز شود، تاخير انتقال داده از حافظه كاشه سطح 2 به سطح 1 اهميت اندكي پيدا خواهد كرد. البته «بارگذاري» خارج از نوبت دادهاي كه قبل از آن در عمليات «ذخيرهسازي» شركت كرده مطلوب نيست ، چرا كه اين عمل خارج از نوبت مقدار قديمي و بي ارزش داده را بارگذاري ميكند. به تصوير شماره 2 توجه كنيد:
تصویر شماره 2
عمليات بارگذاري Load2 نمي تواند خارج از نوبت اجرا شود، چرا كه مقدار آن تا زماني كه عمليات ذخيره سازي Store1 به اتمام نرسيده ارزشمند نيست. تنها زماني كه Store1 به اتمام رسد متغير Y مقدار صحيحي پيدا خواهد كرد. با اين حال هيچ دليلي براي تاخير در پيش افتادن عمليات بارگذاري Load4 وجود ندارد، اين دستور بارگذاري مستقل از ساير دستورات ذخيرهسازي پيشين خود است و اجراي خارج از نوبت آن توام با افزايش عملكرد نهايي خواهد بود.
در حال حاضر، پردازنده ها عمليات load4 را تا زماني كه قبل از آن عمليات «ذخيرهسازي» وجود دارد به تاخير مياندازند، چرا كه پردازندههاي كنوني در شناسايي وابستگي «بارگذاري» و «ذخيرهسازي» ناتوان بوده و امكان بارگذاري داده غير ارزشمند در صورت پيشي افتادن «بارگذاري» به وجود خواهد آمد.
در معماري Core براي اولين بار راهكاري براي حل اين مشكل به نام «آشكارسازي حافظه» (Memory Disambiguation) تدارك ديده شده، در اين ويژگي از الگوريتم هوشمندي استفاده شده تا وابستگي دستورالعمل «بارگذاري» را با «ذخيرهسازي»هاي پيشين خود مشخص نمايد. اجراي خارج از نوبت «بارگذاري»ها افزايش عملكرد زيادي را به همراه خواهد آورد، در برخي از كدهاي كوچك محك زني، اينتل حداكثر 40 درصد افزايش كارايي را گزارش كرده است، اگرچه اين ميزان افزايش كارايي در برنامههاي واقعي مشاهده نخواهند شد اما تاثير غير قابل انكار و افزايش عملكرد ملموسي به همراه دارد. زيرا همانطور كه در ابتداي مقاله به آن اشاره كرديم، دستورالعملهاي «بارگذاري» حدود يك سوم micro-opهاي پردازنده ها در زمان اجراي يك برنامه عمومي را تشكيل مي دهند كه بارگذاري داده هاي مطلوب آنها از حافظه كاشه سطح 2 (در حالت بد تر از حافظه اصلي) منجر به كندي اجراي برنامه خواهد شد. اما اين ويژگي انعطاف پذير و نوين معماري Core چگونه با ساير معماريها رقابت ميكند؟ به جدول شماره (3) توجه كنيد:
جدول شماره 3
در معماري هاي P6 و P-M تدابيري براي اجراي خارج از دستور «بارگذاري» قبل از ساير «بارگذاري»ها انديشيده شده بود همچنين امكان جلو افتادن دستورالعملهاي «بارگذاري» از«ذخيرهسازي»هاي پيشين خود نيز در صورتي كه آدرس داده ذخيره شده شناخته شده و با آدرس «بارگذاري» متفاوت باشد فراهم آمده بود اما در اكثر موارد اين آدرس هنوز توسط محاسبه نشده و عمليات «بارگذاري» در موارد اندكي ميتوانست از عمليات «ذخيرهسازي» جلو بیافتد. برخلاف P6، در معماري K8 تنها امكان پيشي گرفتن «بارگذاري» از عمليات ALU (مانند دستورالعمل ADD) فراهم شده است، به طور كلي «بارگذاري»ها به تنهايي نميتوانند خارج از نوبت اجرا شده تا تاثير تاخير حافظه كاشه را از ميان بردارند از طرف ديگر «بارگذاري»ها نمي توانند از توان اجرايي بالقوه CPU در زماني كه پردازنده در انتظار اتمام عمليات «ذخيرهسازي»است استفاده كنند. اين ها همه به اين معني هستند كه پردازنده Athlon 64 در اجراي خارج از نوبت كدها داراي محدوديتهاي متعددي است.
شايد يكي از مهمترين دلايلي كه پردازنده هاي Athlon 64 علیرغم داشتن دسترسي به حافظه سریع تر و منابع محاسباتي عدد صحيح بيشتر، توانايي پيشي گرفتن از پردازنده هاي هم رده Core Duo خود را در بازيها و محاسبات عدد صحيح را ندارند همين موضوع باشد.
اجراي دستورات چندرسانهاي
يكي ديگر از نوآوري هاي معماري Core، قدرت بالاي آن در پردازش دستورالعمل هاي چندرسانه اي SSE است، در معماري هاي پيشين اينتل تنها يك واحد 128 بيتي براي دستورالعمل هاي SSE در نظر گرفته شده همچنين در معماري K8 دو واحد SSE وجود دارد، اما در معماري Core سه واحد قدرتمند براي SSE در نظر گرفته شده است كه دو واحد آن به صورت موازيهم عمل ميكنند.
در پردازنده هاي فعلي، دستورالعمل هاي 128 بيتي SSE طي دو سيكل ساعت اجرا مي شدند، كه در سيكل اول 64 بيت ابتدايي و در سيكل دوم 64 بيت انتهايي اجرا شده نتيجه نهايي را حاصل مي كردند، با اختصاص دادن دو واحد اجرايي موازي در معماري Core به اين امر، هم اكنون امكان پردازش دستورالعمل هاي SSE در يك سيكل كلاك فراهم گشته است، علاوه بر اين سازگاري با شيوه هاي سنتي پردازش SSE نيز توسط واحد غيرموازي سوم در نظر گرفته شده.
تصویر شماره 3
در تصوير شماره(3) تفاوت عملكرد واحد SSE معماري Core با ساير معماريها نشان داده شده است، حاصل عمليات SSE بر روي دو عملوند X و Y در معماري Core تنها در يك سيكل ساعت محاسبه مي گردد در حالي كه در ساير معماري ها به دليل داشتن واحد هاي SSE كمتر در دو سيكل ميسر ميشود.
با گسترش تعداد و كاربردهاي دستورالعمل هاي SSE در برنامه هاي چندرسانه اي مانند پردازش ويديويي، تصويري و صوتي، برنامه هاي پيچيده رمزنگاري و مهندسي، معماري Core عملكرد غير قابل مقايسهاي نسبت به ساير معماريها ارائه خوهد كرد.
