saeid6574598
2011/11/08, 05:26
فلسفه بولدوزر بودن:
اکنون بیایید تا از فلسفه ساخت بولدوزر سخن بگوییم. اول از همه توضیحی لازم است:
در حال حاضر پردازنده ها از دو راه برای بهبود عملکرد خود استفاده می کنند. یکی استفاده از چند هسته فیزیکی برای پردازش است و دومی استفاده از مولتی تریدینگ موازی می باشد. ای ام دی، بولدوزر را به عنوان راه سومی در بین این دو مطرح می کند. با همراهی شما، ابتدا توضیح این دو را خواهیم داد و بعد به سراغ بررسی Bulldozer خواهیم رفت.
استفاده از چند هسته فیزیکی برای پردازش: می دانید که در این چند ساله اخیر رقابت بر سر زیاد کردن هسته ها بوده. تا جایی که اینتل Core i7-980X و ای ام دی، Phenom II X6 1090T را عرضه کرد که هر دو این ها پردازنده های شش هسته ای هستند. استفاده از ۶ هسته، موجب عملکرد ۶ برابر نسبت به فرکانس خواهد شد. البته لازم است بدانید که برنامه ها هم باید برای ۶ هسته بهینه سازی شوند.
برای مثال اگر شما یک برنامه با Visual Basic.net بنویسید. که اعداد ۱ تا ۱۰۰۰۰ را یکی یکی در یک جعبه متن چاپ کند، به پردازنده فشار خواهد آورد. اگر اتمام این برنامه برای یک پردازنده ۲ هسته ای با فرکانس ۲.۶ گیگاهرتز،۷ دقیقه طول بکشد. برای یک پردازنده ۴ هسته ای با همین فرکانس نیز هفت دقیقه طول خواهد کشید. چون این برنامه فقط از یک هسته استفاده می کند و به این ترتیب، پردازنده دو هسته ای از ۵۰ درصد و پردازنده چهار هسته ای از ۲۵ درصد توان خودش بهره خواهد برد! اگر باور ندارید می توانید، برنامه تست پردازنده را با حجم ۵۶ کیلوبایت، برای ویندوز دانلود کنید (این یک برنامه کم حجم و کوچک است که جای بهبود دارد و صرفا برای اثبات این مساله ساخته شده و جنبه بنچ مارک گیری ندارد)
به این ترتیب با بهینه سازی برنامه ها می توان به نتایج بسیار بهتری دست یافت و استفاده از چند هسته فیزیکی برای پردازش کمک بسیار زیادی به عملکرد بهتر می باشد.
استفاده از Multi-Threading :
ابتدا باید توضیحی را از مولتی تریدینگ ارائه کنیم. برای اطلاعات بیشتر می توانید به مطلب بررسی دایرکت ایکس یازده مراجعه نمایید و این دقیقا همان تعریفی است که در آن مقاله ارائه دادیم:
گاهی اوقات لازم می شود که هر برنامه و بازی دو یا چند عمل را به صورت هم زمان انجام دهد؛ بدون این که از دسترس خارج و به قول معروف Not Responding شود. برای مثال در بازی ها وقتی شما در حال تیر اندازی کردن هستید از ویژگی مولتی تریدینگ استفاده می کنید چون هم حرکات شما پردازش می شود و هم حرکات و اعمال دشمنان شما.
پس مولتی تریدینگ کمک می کند که چند عمل به طور همزمان انجام شود. اما برنامه ها باید برای مولتی تریدینگ نیز بهینه سازی شوند. ولی انتظار نداشته باشید که برای اثبات این یکی هم برنامه بدهیم! در عوض یک نکته مهم: مولتی تریدینگ با پردازنده ها سر و کار مستقیم دارد و پردازنده ای که Thread های بیشتری داشته باشد، در این کار موفق تر است. یک پردازنده ۶ هسته ای با ۱۲ ترید می تواند، در هر هسته خود ۲ کار را همزمان انجام دهد. لازم به ذکر است که در یک برنامه خوب، بسته به سنگینی عملیات پردازشی، کار ها بین ترید ها و هسته ها تقسیم می شوند. برای مثال ۱۲ کار کوچک بین دوازده ترید، اگر نه شش کار بزرگ بین ۶ هسته و باز هم اگر نشد، ۳ کار سنگین، هر کدام با دو هسته و ….
در اعماق یک بولدوزر:
حالا می خواهیم ببینیم که این راه سومی که ای ام دی میگوید چیست؟ در زیر دو دیاگرم می بینید. دیاگرم سمت چپ، یک چیپ دو هسته ای است. معماری این چیپ شبیه معماری اصلی بولدوزر است. اما به دیاگرم سمت راست بنگرید تا اوج کار را در یابید. این یک چیپ یک هسته ای است که این دو هسته را در خود جای داده است!
فقط کاربران عضو قادر به مشاهده لینکها هستند. فقط کاربران عضو قادر به مشاهده لینکها هستند.
با این که کار جالبی است، اما ما هنوز هم مشکوک هستیم که آیا نامیدن بولدوزر به عنوان "راه سوم" درست است یا این که فقط تقلیدی است از تکنولوژی Hyper Threading اینتل؟
قبل از همه چیز باید شما را با مفهوم پایپ لاین آشنا کنم . پایپ لاین (pipe line) ها یک سری از عناصر پردازش اطلاعات هستند که به یک دیگر متصل شده اند و معمولا به طور موازی کار می کنند. بر این اساس، خروجی هر چیپ پردازنده، ورودی چیپ پردازنده بعدی خواهد بود و به همین ترتیب عملیات تا اتمام کار ادامه پیدا می کند. بیشتر شدن تعداد پایپ لاین ها در مولتی تریدینگ (در مطلب مربوط به بررسی دایرکت ایکس یازده توضیح آن داده شد) و سرعت عملیات پردازشی تاثیر زیادی می گزارد. به یاد داشته باشید که در پردازنده ها هر Thread از تعدادی پایپ لاین تشکیل شده که در دیاگرام های بالا هم می توانید صحت این مساله را دریابید.
تکنولوژی هایپر تریدینگ اینتل، راندمان کاری هسته ها را با استفاده از اتحاد کاری ترید ها و پایپ لاین ها بالا می برد. به این صورت که دستورات را به حد نساب پایپ لاین ها رسانده و در یک ثانیه به تمامی پایپ لاین های هسته، اعمال می کند. در این وضعیت، در شرایطی که پردازنده منتظر کد ها از ترید A هست، هایپر تریدینگ، عملیات دیگر را به سمت ترید B سوق می دهد تا از حداکثر ظرفیت پردازنده، استفاده شود. به این ترتیب دیگر نقطه خللی به وجود نمی آید. این کاری است که هم هایپر تریدینگ انجام می دهد و هم معماری Bulldozer ولی کار بولدوزر تنها این نیست، این معماری دو هسته را در یک ماژول گرد آوری کرده و کنترل بیشتری بر ترید ها دارد به این ترتیب وضعیت این گونه می شود:(به پاراگراف پایین، دقت بسیار داشته باشید)
باید برای شما یک سناریو را تعریف کنیم : فکر کنید که پردازنده درگیر یک عملیات سنگین است. دستورات در کش سطح یکی که در هسته اول است ذخیره شده اند. پردازنده صبر می کند که دستورات به حد نصاب کل پایپ لاین های هسته اول برسند و این کار را با هسته دوم نیز انجام می دهد. (فرض می کنیم که هر هسته تنها یک Thread دارد.) برای مثال اگر کل پایپ لاین های هسته اول، ۴ عدد باشند و روی هم، توان پردازشی معادل ۴۰۰ گیگافلاپ را داشته باشند و کد ها به این توان برسند، پردازنده یک باره کد ها را از کش دستورات به هسته اول منتقل کرده و پردازش را انجام میدهند. اما حالا تصور کنید که در دور دوم، کد های هسته اول به ۳۰۰ گیگافلاپ و توان پردازشی مورد نیاز برای کد های هسته دوم به ۱۰۰ گیگافلاپ برسند. پردازنده آن ها را به هسته اول می برد و هسته دوم را باز می گذارد. به این ترتیب از ظرفیت های هسته اول نهایت استفاده صورت می گیرد و در طی کار هسته اول، هسته دوم می تواند دستورات را به حد نصاب خودش رسانده و عمل کند. به این ترتیب، از حداکثر ظرفیت برای مولتی تریدینگ استفاده شده و دیگر هیچ خللی باقی نمی ماند. این نکته هوشمندانه کاری است که در Bulldozer صورت گرفته.(فلاپ یک واحد رایج در اندازه گیری توان پردازشی است. البته در این مثال کاری به زیاد یا کم بودن قدرت نداریم و فقط یک عدد تصادفی را برای مثال در نظر گرفته ایم)
فقط کاربران عضو قادر به مشاهده لینکها هستند.
همانطور که در دیاگرام بالا می بینید، این معماری سطوح مختلفی را شامل می شود. کش L3 که با رنگ خاکستری مشاهده می کنید در سراسر پردازنده به اشتراک گذاشته می شود. قسمت های صورتی رنگ در سطح ماژول به اشتراک گذاشته می شوند و قسمت های آبی رنگ که از اصلی ترین اجزاء پردازشی هستند، به طور اختصاصی کار می کنند و البته طبیعتا کنترل آن ها برای پردازنده امکان پذیر می باشد.
چیزی که این دیاگرم نشان می دهد، استفاده از ماژول به جای هسته است. این کار باعث شده که ماژول ها بتوانند، خود کنترل عملیات پردازشی را به دست بگیرند. پس مجددا تاکید می شود که اگر از پتانسیل های نرم افزاری بولدوزر نیز استفاده شود، احتمالا در سال های آتی شاهد کنترل ماژول ها توسط برنامه و کنترل هسته ها توسط پردازنده، خواهیم بود. این یعنی عملکردی بسیار بالا تر و پایدار تر. اما قضیه به همین سادگی نیست و در آن چند نکته مهم وجود دارد که در ادامه به آن خواهیم رسید.
به گفته AMD، تحقیقات گسترده ای انجام شده و نتیجه این بوده که برای به دست آوردن عملکرد بهتر لازم است هر ماژول از دو هسته بهره ببرد. اگر تعریف گنگ است، لازم نیست نگرانی به خود راه بدهید، چون در ادامه مروری خواهیم داشت بر همه ی موارد باقی مانده.
-زیر کاپوت:
از عهد K7 تا کنون، هیچکدام از پردازنده های AMD، در پشتیبانی از کد های x86، به اندازه بولدوزر قوی نبوده اند. اول یک تعریف از کد های x86 و اطلاعات بیشتر را می توانید در مطلب بررسی باب کت بیابید:
دستورات x86، دستورات ۳۲ بیتی هستند که توسط سیستم عامل به پردازنده داده می شوند. البته این دستورات فقط برای سیستم عامل نیست و بسیاری از برنامه های ۳۲ بیتی نیز از این نوع دستورات در کد های خود استفاده می کنند. دستورات x86 از زمانی متداول شدند که اینتل پردازنده های ۳۲ بیتی را روانه بازار کرد و همگان به مزایای بالا و گسترده بودن اعمال قابل انجام توسط این پردازنده ها پی بردند و پس از آن، این پردازنده ها گسترش زیادی یافتند.
اما معماری بولدوزر برای این کد ها تدیبیری چهار گانه اندیشیده است! یعنی این معماری و پردازنده های مبتنی بر آن، مجهز به چهار کدگشا برای کد های ایکس ۸۶ خواهند بود! پس بولدوزر در این مورد، در سطح معماری گران قیمت Nehalem اینتل قرار دارد. این در حالی است که محصولات قبلی AMD از سه کد گشا استفاده می کردند.
اما حالا که کاپوت یک بولدوزر را بالا زده ایم، لازم است به جزئیات ریز و مهم آن نیز توجه داشته باشیم. اکنون می خواهیم توضیحاتی را در مورد واحد استنباطی پردازنده یا Branch Prediction Unit مطرح کنیم.
فقط کاربران عضو قادر به مشاهده لینکها هستند.
اکنون بیایید تا از فلسفه ساخت بولدوزر سخن بگوییم. اول از همه توضیحی لازم است:
در حال حاضر پردازنده ها از دو راه برای بهبود عملکرد خود استفاده می کنند. یکی استفاده از چند هسته فیزیکی برای پردازش است و دومی استفاده از مولتی تریدینگ موازی می باشد. ای ام دی، بولدوزر را به عنوان راه سومی در بین این دو مطرح می کند. با همراهی شما، ابتدا توضیح این دو را خواهیم داد و بعد به سراغ بررسی Bulldozer خواهیم رفت.
استفاده از چند هسته فیزیکی برای پردازش: می دانید که در این چند ساله اخیر رقابت بر سر زیاد کردن هسته ها بوده. تا جایی که اینتل Core i7-980X و ای ام دی، Phenom II X6 1090T را عرضه کرد که هر دو این ها پردازنده های شش هسته ای هستند. استفاده از ۶ هسته، موجب عملکرد ۶ برابر نسبت به فرکانس خواهد شد. البته لازم است بدانید که برنامه ها هم باید برای ۶ هسته بهینه سازی شوند.
برای مثال اگر شما یک برنامه با Visual Basic.net بنویسید. که اعداد ۱ تا ۱۰۰۰۰ را یکی یکی در یک جعبه متن چاپ کند، به پردازنده فشار خواهد آورد. اگر اتمام این برنامه برای یک پردازنده ۲ هسته ای با فرکانس ۲.۶ گیگاهرتز،۷ دقیقه طول بکشد. برای یک پردازنده ۴ هسته ای با همین فرکانس نیز هفت دقیقه طول خواهد کشید. چون این برنامه فقط از یک هسته استفاده می کند و به این ترتیب، پردازنده دو هسته ای از ۵۰ درصد و پردازنده چهار هسته ای از ۲۵ درصد توان خودش بهره خواهد برد! اگر باور ندارید می توانید، برنامه تست پردازنده را با حجم ۵۶ کیلوبایت، برای ویندوز دانلود کنید (این یک برنامه کم حجم و کوچک است که جای بهبود دارد و صرفا برای اثبات این مساله ساخته شده و جنبه بنچ مارک گیری ندارد)
به این ترتیب با بهینه سازی برنامه ها می توان به نتایج بسیار بهتری دست یافت و استفاده از چند هسته فیزیکی برای پردازش کمک بسیار زیادی به عملکرد بهتر می باشد.
استفاده از Multi-Threading :
ابتدا باید توضیحی را از مولتی تریدینگ ارائه کنیم. برای اطلاعات بیشتر می توانید به مطلب بررسی دایرکت ایکس یازده مراجعه نمایید و این دقیقا همان تعریفی است که در آن مقاله ارائه دادیم:
گاهی اوقات لازم می شود که هر برنامه و بازی دو یا چند عمل را به صورت هم زمان انجام دهد؛ بدون این که از دسترس خارج و به قول معروف Not Responding شود. برای مثال در بازی ها وقتی شما در حال تیر اندازی کردن هستید از ویژگی مولتی تریدینگ استفاده می کنید چون هم حرکات شما پردازش می شود و هم حرکات و اعمال دشمنان شما.
پس مولتی تریدینگ کمک می کند که چند عمل به طور همزمان انجام شود. اما برنامه ها باید برای مولتی تریدینگ نیز بهینه سازی شوند. ولی انتظار نداشته باشید که برای اثبات این یکی هم برنامه بدهیم! در عوض یک نکته مهم: مولتی تریدینگ با پردازنده ها سر و کار مستقیم دارد و پردازنده ای که Thread های بیشتری داشته باشد، در این کار موفق تر است. یک پردازنده ۶ هسته ای با ۱۲ ترید می تواند، در هر هسته خود ۲ کار را همزمان انجام دهد. لازم به ذکر است که در یک برنامه خوب، بسته به سنگینی عملیات پردازشی، کار ها بین ترید ها و هسته ها تقسیم می شوند. برای مثال ۱۲ کار کوچک بین دوازده ترید، اگر نه شش کار بزرگ بین ۶ هسته و باز هم اگر نشد، ۳ کار سنگین، هر کدام با دو هسته و ….
در اعماق یک بولدوزر:
حالا می خواهیم ببینیم که این راه سومی که ای ام دی میگوید چیست؟ در زیر دو دیاگرم می بینید. دیاگرم سمت چپ، یک چیپ دو هسته ای است. معماری این چیپ شبیه معماری اصلی بولدوزر است. اما به دیاگرم سمت راست بنگرید تا اوج کار را در یابید. این یک چیپ یک هسته ای است که این دو هسته را در خود جای داده است!
فقط کاربران عضو قادر به مشاهده لینکها هستند. فقط کاربران عضو قادر به مشاهده لینکها هستند.
با این که کار جالبی است، اما ما هنوز هم مشکوک هستیم که آیا نامیدن بولدوزر به عنوان "راه سوم" درست است یا این که فقط تقلیدی است از تکنولوژی Hyper Threading اینتل؟
قبل از همه چیز باید شما را با مفهوم پایپ لاین آشنا کنم . پایپ لاین (pipe line) ها یک سری از عناصر پردازش اطلاعات هستند که به یک دیگر متصل شده اند و معمولا به طور موازی کار می کنند. بر این اساس، خروجی هر چیپ پردازنده، ورودی چیپ پردازنده بعدی خواهد بود و به همین ترتیب عملیات تا اتمام کار ادامه پیدا می کند. بیشتر شدن تعداد پایپ لاین ها در مولتی تریدینگ (در مطلب مربوط به بررسی دایرکت ایکس یازده توضیح آن داده شد) و سرعت عملیات پردازشی تاثیر زیادی می گزارد. به یاد داشته باشید که در پردازنده ها هر Thread از تعدادی پایپ لاین تشکیل شده که در دیاگرام های بالا هم می توانید صحت این مساله را دریابید.
تکنولوژی هایپر تریدینگ اینتل، راندمان کاری هسته ها را با استفاده از اتحاد کاری ترید ها و پایپ لاین ها بالا می برد. به این صورت که دستورات را به حد نساب پایپ لاین ها رسانده و در یک ثانیه به تمامی پایپ لاین های هسته، اعمال می کند. در این وضعیت، در شرایطی که پردازنده منتظر کد ها از ترید A هست، هایپر تریدینگ، عملیات دیگر را به سمت ترید B سوق می دهد تا از حداکثر ظرفیت پردازنده، استفاده شود. به این ترتیب دیگر نقطه خللی به وجود نمی آید. این کاری است که هم هایپر تریدینگ انجام می دهد و هم معماری Bulldozer ولی کار بولدوزر تنها این نیست، این معماری دو هسته را در یک ماژول گرد آوری کرده و کنترل بیشتری بر ترید ها دارد به این ترتیب وضعیت این گونه می شود:(به پاراگراف پایین، دقت بسیار داشته باشید)
باید برای شما یک سناریو را تعریف کنیم : فکر کنید که پردازنده درگیر یک عملیات سنگین است. دستورات در کش سطح یکی که در هسته اول است ذخیره شده اند. پردازنده صبر می کند که دستورات به حد نصاب کل پایپ لاین های هسته اول برسند و این کار را با هسته دوم نیز انجام می دهد. (فرض می کنیم که هر هسته تنها یک Thread دارد.) برای مثال اگر کل پایپ لاین های هسته اول، ۴ عدد باشند و روی هم، توان پردازشی معادل ۴۰۰ گیگافلاپ را داشته باشند و کد ها به این توان برسند، پردازنده یک باره کد ها را از کش دستورات به هسته اول منتقل کرده و پردازش را انجام میدهند. اما حالا تصور کنید که در دور دوم، کد های هسته اول به ۳۰۰ گیگافلاپ و توان پردازشی مورد نیاز برای کد های هسته دوم به ۱۰۰ گیگافلاپ برسند. پردازنده آن ها را به هسته اول می برد و هسته دوم را باز می گذارد. به این ترتیب از ظرفیت های هسته اول نهایت استفاده صورت می گیرد و در طی کار هسته اول، هسته دوم می تواند دستورات را به حد نصاب خودش رسانده و عمل کند. به این ترتیب، از حداکثر ظرفیت برای مولتی تریدینگ استفاده شده و دیگر هیچ خللی باقی نمی ماند. این نکته هوشمندانه کاری است که در Bulldozer صورت گرفته.(فلاپ یک واحد رایج در اندازه گیری توان پردازشی است. البته در این مثال کاری به زیاد یا کم بودن قدرت نداریم و فقط یک عدد تصادفی را برای مثال در نظر گرفته ایم)
فقط کاربران عضو قادر به مشاهده لینکها هستند.
همانطور که در دیاگرام بالا می بینید، این معماری سطوح مختلفی را شامل می شود. کش L3 که با رنگ خاکستری مشاهده می کنید در سراسر پردازنده به اشتراک گذاشته می شود. قسمت های صورتی رنگ در سطح ماژول به اشتراک گذاشته می شوند و قسمت های آبی رنگ که از اصلی ترین اجزاء پردازشی هستند، به طور اختصاصی کار می کنند و البته طبیعتا کنترل آن ها برای پردازنده امکان پذیر می باشد.
چیزی که این دیاگرم نشان می دهد، استفاده از ماژول به جای هسته است. این کار باعث شده که ماژول ها بتوانند، خود کنترل عملیات پردازشی را به دست بگیرند. پس مجددا تاکید می شود که اگر از پتانسیل های نرم افزاری بولدوزر نیز استفاده شود، احتمالا در سال های آتی شاهد کنترل ماژول ها توسط برنامه و کنترل هسته ها توسط پردازنده، خواهیم بود. این یعنی عملکردی بسیار بالا تر و پایدار تر. اما قضیه به همین سادگی نیست و در آن چند نکته مهم وجود دارد که در ادامه به آن خواهیم رسید.
به گفته AMD، تحقیقات گسترده ای انجام شده و نتیجه این بوده که برای به دست آوردن عملکرد بهتر لازم است هر ماژول از دو هسته بهره ببرد. اگر تعریف گنگ است، لازم نیست نگرانی به خود راه بدهید، چون در ادامه مروری خواهیم داشت بر همه ی موارد باقی مانده.
-زیر کاپوت:
از عهد K7 تا کنون، هیچکدام از پردازنده های AMD، در پشتیبانی از کد های x86، به اندازه بولدوزر قوی نبوده اند. اول یک تعریف از کد های x86 و اطلاعات بیشتر را می توانید در مطلب بررسی باب کت بیابید:
دستورات x86، دستورات ۳۲ بیتی هستند که توسط سیستم عامل به پردازنده داده می شوند. البته این دستورات فقط برای سیستم عامل نیست و بسیاری از برنامه های ۳۲ بیتی نیز از این نوع دستورات در کد های خود استفاده می کنند. دستورات x86 از زمانی متداول شدند که اینتل پردازنده های ۳۲ بیتی را روانه بازار کرد و همگان به مزایای بالا و گسترده بودن اعمال قابل انجام توسط این پردازنده ها پی بردند و پس از آن، این پردازنده ها گسترش زیادی یافتند.
اما معماری بولدوزر برای این کد ها تدیبیری چهار گانه اندیشیده است! یعنی این معماری و پردازنده های مبتنی بر آن، مجهز به چهار کدگشا برای کد های ایکس ۸۶ خواهند بود! پس بولدوزر در این مورد، در سطح معماری گران قیمت Nehalem اینتل قرار دارد. این در حالی است که محصولات قبلی AMD از سه کد گشا استفاده می کردند.
اما حالا که کاپوت یک بولدوزر را بالا زده ایم، لازم است به جزئیات ریز و مهم آن نیز توجه داشته باشیم. اکنون می خواهیم توضیحاتی را در مورد واحد استنباطی پردازنده یا Branch Prediction Unit مطرح کنیم.
فقط کاربران عضو قادر به مشاهده لینکها هستند.