نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی پرتال اطلاعاتی
  • خانه
  • سیستم عامل
  • Hyper-Threading: دو در یک اینتل یا قابلیت های پنهان Xeon. پردازنده های چند هسته ای: نحوه کار آنها

Hyper-Threading: دو در یک اینتل یا قابلیت های پنهان Xeon. پردازنده های چند هسته ای: نحوه کار آنها

در دستگاه است و من چند پست پیدا کردم، اما من گیج شده ام زیرا برخی گفته اند که شما هسته های منطقی و هسته های فیزیکی و غیره دریافت می کنید.
بنابراین تفاوت بین هسته های منطقی و فیزیکی چیست و آیا راهی برای به دست آوردن هسته های فیزیکی وجود دارد؟ یا منطقی است که هسته های منطقی را در حساب کاربری خود قرار دهیم؟

4 راه حل، وب فرم را برای "پس هسته های پردازشگر منطقی (در مقابل هسته های پردازشگر فیزیکی) چیست؟"

هسته های فیزیکی به سادگی هسته های فیزیکی در یک پردازنده هستند. هسته های منطقی توانایی یک هسته برای انجام دو یا چند کار به طور همزمان است. این از پردازنده‌های اولیه پنتیوم 4 که قادر به انجام کاری که Hyper Threading (HTT) نامیده می‌شود، رشد کرده است.

این بازی زمانی انجام می‌شد که اجزای هسته کمکی برای انواع خاصی از دستورالعمل‌ها استفاده نمی‌شد در حالی که کارهای طولانی دیگر می‌توانست انجام شود. بنابراین، واحد پردازش مرکزی می تواند روی دو چیز به طور همزمان کار کند.

هسته‌های جدید پردازنده‌های کاملاً کاربردی‌تری هستند، بنابراین روی چندین چیز به طور همزمان کار می‌کنند، اما پردازنده‌های واقعی به عنوان هسته‌های فیزیکی نیستند. در این مقاله با عنوان: Intel Core i5 و Core i7: Intel Mainstream Magnum Opus، می‌توانید اطلاعات بیشتری درباره محدودیت‌های ویژگی Hyperthreading و قابلیت‌های فیزیکی هسته را در اینجا بر روی tomshardware بخوانید.

با استفاده از دستور lscpu می توانید خرابی پنجره خود را مشاهده کنید:

$ lscpu معماری: x86_64 CPU op-mode (ها): 32 بیتی، CPU (ها) 64 بیتی: 4 رشته (ها) در هر هسته: 2 هسته (ها) در هر سوکت: 2 سوکت (ها) CPU: 1 NUMA گره (ها): 1 شناسه فروشنده: خانواده CPU GenuineIntel: 6 مدل: 37 پله: 5 مگاهرتز CPU: 2667.000 مجازی سازی: VT-x L1d cache: 32K حافظه نهان L1i: 32K حافظه نهان L2: 256K حافظه نهان L3: 3070K حافظه نهان ): 0-3

لپ تاپ Intel i5 من در بالا دارای 4 "پردازنده" است

پردازنده (ها): 4

که 2 هسته فیزیکی وجود دارد

هسته (ها) در هر سوکت: 2

که هر کدام می تواند تا 2 رشته را اجرا کند

موضوع (ها) در هر هسته: 2

در همان زمان این رشته ها قابلیت های منطقی هسته هستند.

هسته های فیزیکی تعداد هسته های فیزیکی، اجزای سخت افزاری واقعی هستند.

هسته های منطقی تعداد هسته های فیزیکی ضرب در تعداد رشته هایی هستند که می توانند با استفاده از Hyperthreading روی هر هسته اجرا شوند.

برای مثال پردازنده 4 هسته ای من در هر هسته 2 رشته کار می کند، بنابراین من 8 پردازنده منطقی دارم.

$ sudo dmidecode | egrep "Socket تعیین: Proc | ((Thread | Core) Count)" تعیین سوکت: Proc 1 تعداد هسته: 14 تعداد موضوعات: 28 تعیین سوکت: Proc 2 تعداد هسته: 14 تعداد موضوعات: 28

دو لانه. هر کانکتور دارای 14 هسته فیزیکی است. هر هسته دارای دو رشته است (28/14). تعداد کل بلوک های منطقی "cpus" یا پردازش منطقی 56 است (این همان چیزی است که "top" و برخی دستورات دیگر به شما به عنوان عدد "cpus" نشان می دهند).

فناوری Hyperthreading به یک هسته پردازشگر فیزیکی اجازه می دهد تا مانند دو پردازنده منطقی رفتار کند.

بنابراین، یک هسته پردازنده می تواند به طور همزمان دو رشته مستقل را اجرا کند.

اینتل به یک پردازنده فیزیکی به عنوان یک سوکت اشاره می کند.

Hyperthreading به یک پردازنده فیزیکی این امکان را می دهد که طوری رفتار کند که گویی دو پردازنده فیزیکی دارد که به آنها پردازنده های منطقی می گویند. برای چی؟

در حالی که Hyperthreading عملکرد سیستم را دوبرابر نمی کند، می تواند عملکرد را با استفاده از منابع بیکار بهبود بخشد و در نتیجه توان عملیاتی بیشتری برای انواع خاصی از بارهای کاری مهم ایجاد کند. برنامه‌ای که روی یک پردازنده منطقی واحد روی یک هسته شلوغ اجرا می‌شود، می‌تواند انتظار کمی بیش از نیمی از پهنای باندی را داشته باشد که هنگام اجرا در حالت تک روی یک پردازنده غیرهایپرتردینگ دریافت می‌کند.

خلاصه

پردازنده فیزیکی چیزی است که می توانیم ببینیم و بیفتیم.

یک پردازنده منطقی شبیه به: Phsical Core است که به عنوان دو هسته فیزیکی عمل می کند

یک پردازنده پنتیوم 4 اینتل با فرکانس ساعت 3.06 گیگاهرتز که از فناوری Hyper-Threading (HT) استفاده می کند، در بازار سن پترزبورگ ظاهر شده است.
به گفته سازندگان، این فناوری که قبلا فقط در سیستم‌های سرور استفاده می‌شد، کلاس جدیدی از رایانه‌های شخصی رومیزی با کارایی بالا را راه‌اندازی کرد.
با فناوری HT، یک پردازنده فیزیکی توسط سیستم عامل رایانه شخصی و برنامه های کاربردی به عنوان دو پردازنده منطقی درک می شود. به گفته الکسی ناولوکین، رئیس دفتر نمایندگی اینتل در روسیه و کشورهای مستقل مشترک المنافع، داده های اولیه نشان می دهد که پردازنده جدید با فناوری NT به طور متوسط ​​​​25 درصد افزایش عملکرد را ارائه می دهد.

خارج از نوبت
فناوری HT به کاربران اجازه می دهد تا عملکرد رایانه شخصی را از دو طریق بهبود بخشند: هنگام کار با نرم افزاری که از پردازش داده های چند رشته ای استفاده می کند و هنگام کار در محیط های چند وظیفه ای. برنامه هایی که با در نظر گرفتن توانایی پردازشگر جدید برای کار همزمان با چندین قطعه کد (به اصطلاح "رشته ها" - رشته) نوشته شده اند، یک پردازنده فیزیکی Pentium 4 اینتل را با سرعت کلاک 3.06 گیگاهرتز با فناوری HT "می بینند". به عنوان دو پردازنده منطقی فناوری HT به پردازنده اجازه می دهد تا دو جریان داده مستقل را نه به نوبه خود، بلکه همزمان پردازش کند.

برای کسب و کار
با کمک فناوری HT می‌توانید به عنوان مثال شروع به پخش یک آلبوم موسیقی کنید و در عین حال در یک چت پیام‌ها را بدون افت کیفیت صدا رد و بدل کنید. با دانلود یک فایل MP3 از اینترنت در آرشیو موسیقی خود، می توانید یک برنامه آنتی ویروس را به صورت موازی اجرا کنید که از رایانه شما در برابر نفوذ برنامه های ناخواسته از خارج محافظت می کند.
HT فرصت های زیادی را در دنیای تجارت فراهم می کند - رئیس شرکت می تواند به طور همزمان گزارش ها و شاخص های سهام را مشاهده کند، شاخص های سیستم مدیریت خودکار سازمانی را ردیابی کند و با پیمانکاران در تماس باشد. مهندسان و دانشمندانی که از رایانه شخصی مبتنی بر پردازنده Intel Pentium 4 با فناوری Hyper-Threading استفاده می کنند، می توانند با منابع اطلاعاتی به بهترین شکل کار کنند، در حالی که آن را از اینترنت دانلود کرده و از همکاران در قالب فایل هایی با فرمت های مختلف دریافت می کنند - از PDF به XLS.
شرکت‌های ادغام‌کننده پترزبورگ ("Svega +"، "Computer Service 320-80-80"، "Computer-Center KEY" و "Computer World") قصد دارند حداقل 15-20 رایانه مبتنی بر پردازنده Pentium 4 3.06 اینتل را ماهانه با گیگاهرتز بفروشند. تکنولوژی HT.

ما نوشتیم که استفاده از سیستم های Xeon تک پردازنده بی معنی است، زیرا در قیمت بالاتر عملکرد آنها مانند پنتیوم 4 با فرکانس مشابه خواهد بود. اکنون، پس از مطالعه دقیق تر، احتمالاً باید اصلاح کوچکی در این بیانیه ایجاد شود. فناوری Hyper-Threading که در Intel Xeon با هسته Prestonia پیاده سازی شده است واقعاً کار می کند و جلوه قابل توجهی می دهد. اگرچه هنگام استفاده از آن سؤالات زیادی ایجاد می شود ...

عملکرد بدهد

"سریع تر، حتی سریع تر ...". رقابت برای عملکرد سال‌هاست که ادامه دارد، و گاهی اوقات حتی دشوار است که بگوییم کدام جزء رایانه شما سریع‌تر شتاب می‌گیرد. برای این کار، راه‌های جدید بیشتری ابداع می‌شود، و هر چه بیشتر، نیروی کار ماهر و مغزهای باکیفیت‌تر در این فرآیند شبیه بهمن سرمایه‌گذاری می‌شود.

مطمئناً افزایش مداوم عملکرد مورد نیاز است. حداقل، این یک تجارت سودآور است و همیشه یک راه زیبا برای تشویق کاربران به ارتقای "CPU فوق العاده" دیروز به "حتی فوق العاده تر" فردا وجود خواهد داشت. به عنوان مثال، تشخیص همزمان گفتار و ترجمه همزمان به زبان دیگر آرزوی همه نیست؟ یا بازی های غیرمعمول واقع گرایانه با کیفیت تقریباً «سینمایی» (کاملاً توجه را جذب می کند و گاهی اوقات منجر به تغییرات جدی در روان می شود) - آیا این آرزوی بسیاری از گیمرها از پیر و جوان نیست؟

اما اجازه دهید در این مورد، جنبه های بازاریابی را خارج از جعبه برداریم و بر جنبه های فنی تمرکز کنیم. علاوه بر این، همه چیز آنقدر غم انگیز نیست: کارهای فوری (برنامه های کاربردی سرور، محاسبات علمی، مدل سازی و غیره) وجود دارد، جایی که عملکرد بالاتر، به ویژه پردازنده های مرکزی، واقعاً ضروری است.

بنابراین، چه راه هایی برای افزایش عملکرد آنها وجود دارد؟

اورکلاک کردن... این امکان وجود دارد که فرآیند تکنولوژیکی را بیشتر "نازک" کرد و فرکانس را افزایش داد. اما، همانطور که می دانید، این کار آسانی نیست و مملو از انواع عوارض جانبی مانند مشکلات اتلاف گرما است.

افزایش منابع پردازنده- به عنوان مثال، افزایش اندازه حافظه پنهان، اضافه کردن بلوک های جدید (واحد اجرا). همه اینها مستلزم افزایش تعداد ترانزیستورها، افزایش پیچیدگی پردازنده، افزایش سطح قالب و در نتیجه هزینه است.

علاوه بر این، دو روش قبلی، به عنوان یک قاعده، افزایش خطی در بهره وری را ارائه نمی دهند. این در مثال پنتیوم 4 به خوبی شناخته شده است: خطاها در پیش‌بینی انشعاب و وقفه‌ها باعث می‌شود یک خط لوله طولانی از بین برود که به شدت بر عملکرد کلی تأثیر می‌گذارد.

پردازش چندگانه... نصب چندین CPU و توزیع کار بین آنها اغلب بسیار کارآمد است. اما این رویکرد خیلی ارزان نیست - هر پردازنده اضافی هزینه سیستم را افزایش می دهد و یک مادربرد دوگانه بسیار گرانتر از یک مادربرد معمولی است (به مادربردهایی با پشتیبانی از چهار یا بیشتر CPU اشاره نکنیم). علاوه بر این، همه برنامه ها از عملکرد چند پردازنده به اندازه کافی برای توجیه هزینه بهره نمی برند.

علاوه بر چند پردازش "خالص"، چندین گزینه "متوسط" برای سرعت بخشیدن به اجرای برنامه ها وجود دارد:

چند پردازش تراشه (CMP)- دو هسته پردازنده به صورت فیزیکی روی یک قالب با استفاده از یک کش مشترک یا جداگانه قرار دارند. به طور طبیعی، اندازه کریستال بسیار بزرگ است و این نمی تواند روی هزینه تأثیر بگذارد. توجه داشته باشید که چندین مورد از این CPUهای "دوگانه" می توانند روی یک سیستم چند پردازنده نیز اجرا شوند.

Time-Slice Multithreading... پردازنده در فواصل زمانی مشخصی بین رشته های برنامه سوئیچ می کند. سربار ممکن است گاهی اوقات بسیار چشمگیر باشد، به خصوص اگر فرآیندی در حال تعلیق باشد.

Switch-on-Event Multithreading... جابه‌جایی وظایف زمانی که مکث‌های طولانی اتفاق می‌افتد، مانند «از دست رفتن حافظه پنهان»، که تعداد زیادی از آن‌ها برای برنامه‌های سرور معمولی هستند. در این حالت، فرآیندی که منتظر بارگذاری داده ها از حافظه نسبتاً کند در حافظه نهان است، به حالت تعلیق درآمده و منابع CPU را برای سایر فرآیندها آزاد می کند. با این حال، Switch-on-Event Multithreading، مانند Time-Slice Multithreading، همیشه امکان دستیابی به استفاده بهینه از منابع پردازنده را نمی دهد، به ویژه به دلیل خطا در پیش بینی شاخه، وابستگی دستورالعمل ها و غیره.

چند رشته ای همزمان... در این مورد، رشته های برنامه بر روی یک پردازنده "به طور همزمان" اجرا می شوند، یعنی بدون جابجایی بین آنها. منابع CPU طبق اصل "اگر از آن استفاده نمی کنید، آن را به شخص دیگری بدهید" به صورت پویا تخصیص داده می شود. این رویکرد است که زیربنای فناوری Intel Hyper-Threading است که اکنون به آن می پردازیم.

Hyper-Threading چگونه کار می کند

همانطور که می دانید، "پارادایم محاسباتی" فعلی، محاسبات چند رشته ای را فرض می کند. این نه تنها در مورد سرورها که در ابتدا چنین مفهومی وجود دارد، بلکه برای ایستگاه های کاری و سیستم های دسکتاپ نیز صدق می کند. Thread ها می توانند به یک یا برنامه های مختلف اشاره داشته باشند، اما تقریباً همیشه بیش از یک رشته فعال وجود دارد (برای اطمینان از این موضوع کافی است Task Manager را در Windows 2000 / XP باز کنید و نمایش تعداد رشته ها را روشن کنید) . در همان زمان، یک پردازنده معمولی می تواند تنها یکی از رشته ها را در یک زمان اجرا کند و مجبور است دائماً بین آنها سوئیچ کند.

برای اولین بار، فناوری Hyper-Threading در پردازنده Intel Xeon MP (Foster MP) پیاده سازی شد که روی آن آزمایش شد. به یاد بیاورید که Xeon MP که رسماً در بهار 2002 IDF ارائه شد، از هسته Pentium 4 Willamette استفاده می کند، حاوی 256 کیلوبایت کش L2 و 512 کیلوبایت / 1 مگابایت کش L3 است و از پیکربندی های 4 پردازنده پشتیبانی می کند. همچنین، پشتیبانی از Hyper-Threading در پردازنده ایستگاه های کاری - Intel Xeon (هسته Prestonia، حافظه نهان L2 512 کیلوبایت)، که کمی زودتر از Xeon MP به بازار آمد، وجود دارد. خوانندگان ما در حال حاضر با پیکربندی‌های پردازنده دوگانه در Intel Xeon آشنا هستند، بنابراین ما قابلیت‌های Hyper-Threading را با استفاده از این CPUها به عنوان مثال در نظر خواهیم گرفت - هم از نظر تئوری و هم از لحاظ عملی. به هر حال، یک Xeon "ساده" یک چیز پیش پا افتاده تر و قابل هضم تر از Xeon MP در سیستم های 4 پردازنده است ...

اصل Hyper-Threading بر این واقعیت استوار است که در هر زمان معین، تنها بخشی از منابع پردازنده در هنگام اجرای کد برنامه استفاده می شود. منابع استفاده نشده نیز می توانند با کار بارگیری شوند - برای مثال، می توان از آنها برای اجرای موازی برنامه دیگری (یا رشته دیگری از همان برنامه) استفاده کرد. در یک پردازنده فیزیکی Intel Xeon، دو پردازنده منطقی (LP - Logical Processor) تشکیل شده است که منابع محاسباتی CPU را به اشتراک می گذارند. سیستم عامل و برنامه‌ها دقیقاً دو CPU را می‌بینند و می‌توانند کار را بین آنها توزیع کنند، همانطور که در مورد یک سیستم دو پردازنده تمام عیار است.

یکی از اهداف پیاده سازی Hyper-Threading این است که در صورت وجود تنها یک رشته فعال، به آن اجازه دهیم با همان سرعتی که در یک CPU معمولی وجود دارد، اجرا شود. برای این، پردازنده دارای دو حالت عملکرد اصلی است: Single-Task (ST) و Multi-Task (MT). در حالت ST، تنها یک پردازنده منطقی فعال است که از منابع موجود (حالت ST0 و ST1) بهره کامل می برد. LP دیگر با دستور HALT متوقف شد. هنگامی که رشته برنامه دوم ظاهر می شود، پردازنده منطقی بیکار فعال می شود (از طریق یک وقفه) و CPU فیزیکی در حالت MT قرار می گیرد. توقف LP های استفاده نشده با دستور HALT بر عهده سیستم عامل است که در نهایت مسئولیت اجرای سریع یک رشته مانند حالت بدون Hyper-Threading را بر عهده دارد.

برای هر یک از دو LP، اصطلاحاً وضعیت معماری (AS) ذخیره می شود که شامل وضعیت انواع رجیسترها - منظور عمومی، کنترل، APIC و سرویس است. هر LP دارای APIC (کنترل کننده وقفه) و مجموعه ای از رجیسترها است که برای عملکرد صحیح، مفهوم ثبت نام مستعار جدول (RAT) معرفی شده است، که مطابقت بین هشت رجیستر IA-32 همه منظوره و 128 را نظارت می کند. رجیسترهای فیزیکی CPU (یک RAT برای هر LP).

هنگام کار با دو جریان، دو مجموعه متناظر از نشانگرهای دستورالعمل بعدی پشتیبانی می شوند. بیشتر دستورالعمل‌ها از Trace Cache (TC) گرفته می‌شوند، جایی که به شکل رمزگشایی ذخیره می‌شوند، و دو LP فعال به طور متناوب، از طریق یک چرخه ساعت، به TC دسترسی پیدا می‌کنند. در همان زمان، زمانی که تنها یک LP فعال است، بدون اینکه ساعت را در هم بریزد، به TC دسترسی انحصاری پیدا می کند. دسترسی به رام میکروکد نیز به همین صورت انجام می شود. بلوک‌های ITLB (Instruction Translation Look-Aside Buffer) که در غیاب دستورالعمل‌های لازم در کش دستورالعمل استفاده می‌شوند، کپی می‌شوند و هر کدام دستورالعمل‌ها را برای جریان خود ارائه می‌دهند. واحد رمزگشای دستورالعمل IA-32 Instruction Decode مشترک است و هنگامی که نیاز به رمزگشایی دستورالعمل‌ها برای هر دو جریان باشد، آنها را یک به یک (دوباره، در هر چرخه ساعت) ارائه می‌دهد. بلوک‌های Uop Queue و Allocator به دو قسمت تقسیم می‌شوند و نیمی از عناصر را برای هر LP اختصاص می‌دهند. زمانبندها، 5 عدد، صف های دستورات رمزگشایی شده (Uops) را با وجود تعلق به LP0 / LP1 پردازش می کنند و بسته به آمادگی برای اجرای اولی و در دسترس بودن دومی، دستوراتی را برای اجرای واحدهای اجرایی لازم ارسال می کنند. حافظه پنهان همه سطوح (L1 / L2 برای Xeon، و همچنین L3 برای Xeon MP) به طور کامل بین دو LP به اشتراک گذاشته شده است، با این حال، برای اطمینان از یکپارچگی داده ها، رکوردها در DTLB (Data Translation Look-Aside Buffer) همراه با توصیف کننده هایی در شکل شناسه های پردازشگر منطقی

بنابراین، دستورالعمل های هر دو CPU منطقی می توانند به طور همزمان بر روی منابع یک پردازنده فیزیکی اجرا شوند که به چهار کلاس تقسیم می شوند:

  • تکراری (کپی شده);
  • به طور کامل به اشتراک گذاشته شده (به طور کامل به اشتراک گذاشته شده)؛
  • با توصیفگرهای عنصر (Entry Tagged);
  • بسته به حالت عملکرد ST0 / ST1 یا MT به صورت پویا پارتیشن بندی می شود.

در عین حال، بیشتر برنامه‌های کاربردی شتاب‌دهی شده در سیستم‌های چند پردازنده‌ای را می‌توان بر روی یک CPU با فعال بودن Hyper-Threading بدون هیچ گونه تغییری تسریع کرد. اما مشکلاتی نیز وجود دارد: برای مثال، اگر یک فرآیند در یک حلقه انتظار باشد، می‌تواند تمام منابع CPU فیزیکی را اشغال کند و از کارکرد LP دوم جلوگیری کند. بنابراین، عملکرد در هنگام استفاده از Hyper-Threading گاهی اوقات می تواند کاهش یابد (تا 20٪). برای جلوگیری از این امر، اینتل توصیه می کند به جای حلقه های انتظار خالی، از دستورالعمل PAUSE (که در IA-32 از پنتیوم 4 معرفی شده است) استفاده کنید. کار بسیار جدی نیز در مورد بهینه سازی کد خودکار و نیمه خودکار در حین کامپایل در حال انجام است - به عنوان مثال، کامپایلرهای سری Intel OpenMP C ++ / Fortran Compilers () در این زمینه پیشرفت چشمگیری داشته اند.

یکی دیگر از اهداف اولین اجرای Hyper-Threading، طبق گفته اینتل، به حداقل رساندن افزایش تعداد ترانزیستورها، سطح دای و مصرف انرژی با افزایش قابل توجه عملکرد بود. بخش اول این تعهد قبلاً محقق شده است: اضافه شدن پشتیبانی از Hyper-Threading به Xeon / Xeon MP باعث افزایش سطح دای و مصرف انرژی کمتر از 5٪ شده است. اتفاقی که با قسمت دوم (اجرا) افتاد، هنوز باید بررسی کنیم.

بخش عملی

به دلایل واضح، ما سیستم‌های سرور 4 پردازنده را روی یک Xeon MP با فعال بودن Hyper-Threading آزمایش نکردیم. اول اینکه کاملا وقت گیر است. و ثانیاً ، اگر در مورد چنین شاهکاری تصمیم بگیریم - به هر حال ، اکنون ، کمتر از یک ماه پس از اعلام رسمی ، تهیه این تجهیزات گران قیمت کاملاً غیر واقعی است. بنابراین، تصمیم گرفته شد که خود را به همان سیستم با دو Intel Xeon 2.2 گیگاهرتز محدود کنیم، که اولین آزمایش این پردازنده ها بر روی آنها انجام شد (به لینک در ابتدای مقاله مراجعه کنید). این سیستم مبتنی بر یک مادربرد Supermicro P4DC6 + (چیپست Intel i860)، حاوی 512 مگابایت RDRAM، یک کارت گرافیک مبتنی بر تراشه GeForce3 (64 مگابایت DDR، درایورهای Detonator 21.85)، یک هارد دیسک Western Digital WD300BB و 6X DVD- بود. رام Windows 2000 Professional SP2 به عنوان یک سیستم عامل استفاده شد.

ابتدا چند برداشت کلی. هنگام نصب یک Xeon با هسته Prestonia، در شروع سیستم، BIOS پیامی در مورد وجود دو CPU نمایش می دهد. اگر دو پردازنده نصب شده باشد، کاربر پیامی در مورد چهار CPU می بیند. سیستم عامل به طور معمول "هر دو پردازنده" را تشخیص می دهد، اما تنها در صورتی که دو شرط وجود داشته باشد.

اولاً، در تنظیمات CMOS آخرین نسخه های BIOS بردهای Supermicro P4DCxx، مورد Enable Hyper-Threading ظاهر شده است که بدون آن سیستم عامل فقط پردازنده (های) فیزیکی را تشخیص می دهد. دوم، از قابلیت های ACPI برای اطلاع رسانی به سیستم عامل در مورد حضور پردازنده های منطقی اضافی استفاده می شود. بنابراین، برای فعال کردن Hyper-Threading، باید گزینه ACPI در CMOS Setup فعال شود و HAL (لایه انتزاعی سخت افزار) با پشتیبانی ACPI نیز باید برای خود سیستم عامل نصب شود. خوشبختانه، در ویندوز 2000، تغییر HAL از PC استاندارد (یا MPS Uni-/Multiprocessor PC) به ACPI Uni-/Multiprocessor PC آسان است - با جایگزینی "درایور کامپیوتر" در مدیر دستگاه. در عین حال، برای ویندوز XP، تنها راه قانونی برای مهاجرت به ACPI HAL، نصب مجدد سیستم بر روی نصب موجود است.

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

  • ارزیابی تاثیر Hyper-Threading بر عملکرد برنامه های کاربردی کلاس های مختلف.
  • این اثر را با تأثیر نصب پردازنده دوم مقایسه کنید.
  • بررسی کنید که چگونه منابع "عادلانه" به پردازنده منطقی فعال در زمانی که LP دوم بیکار است داده می شود.

برای ارزیابی عملکرد، مجموعه‌ای از برنامه‌های کاربردی را انتخاب کردیم که قبلاً برای خوانندگان ما آشنا بوده و در آزمایش سیستم‌های ایستگاه کاری استفاده می‌شوند. بیایید از آخر شروع کنیم و "عادلانه بودن" CPUهای منطقی را بررسی کنیم. همه چیز بسیار ساده است: ابتدا تست‌هایی را روی یک پردازنده با غیرفعال بودن Hyper-Threading اجرا می‌کنیم و سپس فرآیند را تکرار می‌کنیم، Hyper-Threading را فعال می‌کنیم و تنها از یکی از دو CPU منطقی استفاده می‌کنیم (با استفاده از Task Manager). از آنجایی که در این مورد ما فقط به مقادیر نسبی علاقه مندیم، نتایج همه آزمایش ها به "بزرگتر بهتر است" کاهش می یابد و عادی می شود (شاخص های یک سیستم تک پردازنده بدون Hyper-Threading به عنوان یک واحد در نظر گرفته می شود).

خب، همانطور که می بینید، وعده های اینتل در اینجا محقق شده است: تنها با یک رشته فعال، عملکرد هر یک از دو LP دقیقا برابر با سرعت یک CPU فیزیکی بدون Hyper-Threading است. یک LP غیرفعال (هر دو LP0 و LP1) در واقع به حالت تعلیق درآمده و منابع مشترک، تا آنجا که می توانیم از نتایج به دست آمده قضاوت کنیم، به طور کامل به استفاده از LP فعال منتقل می شوند.

بنابراین، ما اولین نتیجه را می گیریم: دو پردازنده منطقی در واقع برابر هستند و فعال کردن Hyper-Threading با کار یک رشته "تداخلی" نمی کند (که به خودی خود بد نیست). حال بیایید ببینیم که آیا این گنجاندن "کمک می کند"، و اگر چنین است، کجا و چگونه؟

تفسیر... نتایج چهار آزمایش در بسته های مدل سازی سه بعدی 3D Studio MAX 4.26، Lightwave 7b و A | W Maya 4.0.1 به دلیل شباهت آنها در یک نمودار ترکیب شده است.

در هر چهار مورد (برای Lightwave - دو صحنه مختلف)، بارگذاری CPU با یک پردازنده با Hyper-Threading غیرفعال شده تقریباً همیشه در 100٪ نگه داشته می شود. با این وجود، وقتی Hyper-Threading فعال است، محاسبه صحنه تسریع می‌شود (در نتیجه ما حتی یک شوخی در مورد بار CPU بیش از 100٪ داشتیم). در سه آزمایش، ما می‌توانیم شاهد افزایش 14-18 درصدی عملکرد Hyper-Threading باشیم - از یک طرف، در مقایسه با CPU دوم زیاد نیست، اما از طرف دیگر، با توجه به اثر "رایگان" بسیار خوب است. از این اثر در یکی از دو تست با Lightwave، افزایش عملکرد عملاً صفر است (ظاهراً این به دلیل خاص بودن این برنامه است که پر از عجیب و غریب است). اما نتیجه منفی در هیچ کجا وجود ندارد و افزایش محسوس در سه مورد دیگر دلگرم کننده است. و این در حالی است که فرآیندهای رندر موازی کار مشابهی را انجام می دهند و به احتمال زیاد ممکن است بهترین راه برای استفاده همزمان از منابع CPU فیزیکی نباشد.

کدگذاری فتوشاپ و MP3... کدک GOGO-no-coda 2.39c یکی از معدود کدک هایی است که از SMP پشتیبانی می کند و عملکردی 34 درصدی را از فناوری دو پردازنده نشان می دهد. در عین حال، تأثیر Hyper-Threading در این مورد صفر است (3٪ اختلاف را قابل توجه نمی دانیم). اما در آزمایش با فتوشاپ 6.0.1 (اسکریپتی متشکل از مجموعه بزرگی از دستورات و فیلترها) می توانید با فعال کردن Hyper-Threading شاهد کاهش سرعت باشید، اگرچه پردازنده فیزیکی دوم در این مورد 12 درصد عملکرد را اضافه می کند. این در واقع اولین موردی است که Hyper-Threading باعث کاهش عملکرد می شود ...

OpenGL حرفه ای... مدتهاست که مشخص شده است که SPEC ViewPerf و بسیاری از برنامه های OpenGL دیگر اغلب در سیستم های SMP کند می شوند.

OpenGL و پردازشگر دوگانه: چرا آنها دوست نیستند

بارها در مقالات خود توجه خوانندگان را به این واقعیت جلب کرده‌ایم که پلتفرم‌های دو پردازنده در هنگام انجام تست‌های حرفه‌ای OpenGL به ندرت مزیت قابل توجهی نسبت به تک‌پردازنده‌ها نشان می‌دهند. علاوه بر این، اغلب مواردی وجود دارد که نصب یک پردازنده دوم، برعکس، عملکرد سیستم را هنگام ارائه صحنه های سه بعدی پویا کاهش می دهد.

به طور طبیعی، نه تنها ما متوجه این عجیب و غریب شدیم. برخی از آزمایش‌کنندگان به سادگی این واقعیت را نادیده گرفتند - به عنوان مثال، با استناد به نتایج معیار SPEC ViewPerf فقط برای پیکربندی‌های پردازنده دوگانه، بنابراین از توضیح "چرا یک سیستم دو پردازنده کندتر است؟" دیگران تمام فرضیات خارق العاده ممکن را در مورد انسجام حافظه پنهان، نیاز به حفظ آن، سربار حاصل و غیره مطرح کردند. و بنا به دلایلی هیچ کس تعجب نکرد که به عنوان مثال، پردازنده ها برای نظارت بر انسجام پردازنده ها دقیقاً در حین رندر OpenGL پنجره ای بی تاب بودند (از نظر ماهیت "محاسباتی" آن، تفاوت زیادی با هر مشکل محاسباتی دیگری ندارد) .

در واقع، توضیح، به نظر ما، بسیار ساده تر است. همانطور که می دانید، یک برنامه می تواند روی دو پردازنده سریعتر از یک پردازنده اجرا شود اگر:

  • بیش از دو یا چند رشته به طور همزمان در حال اجرا هستند.
  • این رشته ها در اجرای یکدیگر تداخلی ندارند - برای مثال، آنها برای یک منبع مشترک مانند یک دستگاه ذخیره سازی خارجی یا یک رابط شبکه رقابت نمی کنند.

حال بیایید نگاهی ساده به اینکه رندر OpenGL زمانی که توسط دو رشته انجام می شود چگونه به نظر می رسد بیاندازیم. اگر یک برنامه با "دیدن" دو پردازنده، دو رشته از رندر OpenGL ایجاد کند، سپس برای هر یک از آنها، طبق قوانین OpenGL، متن gl خود ایجاد می شود. بر این اساس، هر رشته به gl-context خود ارائه می شود. اما مشکل اینجاست که برای پنجره‌ای که تصویر در آن نمایش داده می‌شود، تنها یک متن gl می‌تواند در هر لحظه جاری باشد. بر این اساس، نخ ها در این مورد به سادگی "به نوبه خود" تصویر تولید شده را به پنجره خروجی می دهند و متناوب متن خود را جریان می دهند. ناگفته نماند که این «تغییر زمینه ها» از نظر سربار می تواند بسیار گران تمام شود؟

همچنین، برای مثال، نمودارهایی از استفاده از دو CPU در چندین برنامه نمایش دهنده صحنه های OpenGL ارائه خواهیم داد. تمام اندازه‌گیری‌ها بر روی یک پلت فرم با پیکربندی زیر انجام شد:

  • یک یا دو Intel Xeon 2.2 گیگاهرتز (Hyper-Threading غیرفعال است).
  • 512 مگابایت حافظه RDRAM;
  • مادربرد Supermicro P4DC6 +
  • کارت گرافیک ASUS V8200 Deluxe (NVidia GeForce3، 64 مگابایت DDR SDRAM، درایورهای Detonator 21.85)؛
  • Windows 2000 Professional SP2
  • حالت ویدیویی 1280x1024x32 bpp، 85 هرتز، Vsync غیرفعال است.

آبی و قرمز به ترتیب نمودارهای استفاده از CPU 0 و CPU 1 را نشان می دهند. خط وسط نمودار نهایی استفاده از CPU است. این سه نمودار مربوط به دو صحنه از 3D Studio MAX 4.26 و بخشی از معیار SPEC ViewPerf (AWadvs-04) است.


استفاده از CPU: Animation 3D Studio MAX 4.26 - Anibal (با دستکاری کننده ها) .max


استفاده از CPU: انیمیشن 3D Studio MAX 4.26 - Rabbit.max


استفاده از CPU: SPEC ViewPerf 6.1.2 - AWadvs-04

همین الگو در بسیاری از برنامه های کاربردی دیگر که از OpenGL استفاده می کنند تکرار می شود. دو پردازنده اصلاً کار را به زحمت نمی اندازند و کل استفاده از CPU در سطح 50-60٪ است. در عین حال، برای یک سیستم تک پردازنده، در تمام این موارد، استفاده از CPU با اطمینان در 100٪ نگه داشته می شود.

بنابراین، تعجب آور نیست که بسیاری از برنامه های OpenGL در سیستم های دوگانه سرعت زیادی ندارند. خب این که گاهی حتی سرعتشون کم میشه به نظر ما توضیح کاملا منطقی داره.

می‌توانیم بگوییم که با دو CPU منطقی، افت عملکرد حتی قابل‌توجه‌تر است، که کاملاً قابل درک است: دو پردازنده منطقی به همان شکلی که دو پردازنده فیزیکی با یکدیگر تداخل دارند. اما عملکرد کلی آنها، به طور طبیعی، پایین تر است، بنابراین وقتی Hyper-Threading فعال است، حتی بیشتر از زمانی که دو CPU فیزیکی در حال اجرا هستند، کاهش می یابد. نتیجه قابل پیش بینی است و نتیجه گیری ساده است: Hyper-Threading، مانند SMP "واقعی"، گاهی اوقات برای OpenGL ممنوع است.

برنامه های کاربردی CAD... نتیجه گیری قبلی با نتایج دو آزمایش CAD تأیید می شود - SPECapc برای SolidEdge V10 و SPECapc برای SolidWorks. عملکرد گرافیکی این تست ها برای Hyper-Threading مشابه است (اگرچه در مورد سیستم SMP برای SolidEdge V10، نتیجه کمی بالاتر است). اما نتایج آزمایش‌های CPU_Score که پردازنده را بارگذاری می‌کند، شما را به این فکر می‌اندازد: 5-10٪ سود از SMP و 14-19٪ کاهش سرعت از Hyper-Threading.

اما در پایان، اینتل صادقانه در برخی موارد احتمال کاهش عملکرد در طول Hyper-Threading را می پذیرد - به عنوان مثال، هنگام استفاده از حلقه های انتظار خالی. ما فقط می توانیم فرض کنیم که این دلیل است (مطالعه دقیق کدهای SolidEdge و SolidWorks خارج از محدوده این مقاله است). از این گذشته، همه محافظه کاری توسعه دهندگان CAD را می شناسند که قابلیت اطمینان ثابت شده را ترجیح می دهند و عجله خاصی برای بازنویسی کد با در نظر گرفتن روندهای جدید در برنامه نویسی ندارند.

خلاصه کردن یا "توجه، سوال درست"

Hyper-Threading کار می کند، در این شکی نیست. البته، این فناوری جهانی نیست: برنامه هایی وجود دارند که از Hyper-Threading "بدتر" هستند، و اگر این فناوری گسترش یابد، اصلاح آنها مطلوب است. اما آیا همین اتفاق در زمان مقرر در مورد MMX و SSE رخ نداده و همچنان با SSE2 ادامه دارد؟ ..

با این حال، این سوال را در مورد کاربردی بودن این فناوری در واقعیت های ما مطرح می کند. نوع سیستم تک پردازنده مبتنی بر Xeon با Hyper-Threading را فوراً کنار می‌گذاریم (یا اجازه می‌دهیم موقتی باشد، در انتظار خرید پردازنده دوم): حتی افزایش 30 درصدی عملکرد، قیمت را توجیه نمی‌کند. به هر حال - پس بهتر است یک پنتیوم 4 معمولی بخرید. تعداد CPU ها از دو یا بیشتر باقی می ماند.

حالا بیایید تصور کنیم که در حال خرید یک سیستم Xeon دو پردازنده هستیم (مثلاً با ویندوز 2000 / XP Professional). دو CPU نصب شده است، Hyper-Threading روشن است، BIOS به اندازه چهار پردازنده منطقی پیدا می کند، اکنون، چگونه می توانیم آن را خاموش کنیم ... توقف کنید. اما سیستم عامل ما چند پردازنده خواهد دید؟ درست است، دو. فقط دو، زیرا به سادگی برای تعداد بیشتری طراحی نشده است. اینها دو پردازنده فیزیکی خواهند بود، یعنی همه چیز دقیقاً مانند Hyper-Threading غیرفعال کار می کند - نه آهسته تر (دو CPU منطقی "اضافی" به سادگی متوقف می شوند)، اما نه سریع تر (تأیید شده توسط آزمایش های اضافی، نتایج به دست نمی آید. به دلیل شواهد کامل آنها ارائه شده است). هوم، کمی دلپذیر...

آنچه باقی مانده؟ خوب، آیا سرور پیشرفته یا سرور دات نت را روی ایستگاه کاری ما قرار نمی دهید؟ خیر، سیستم خود را نصب می کند، هر چهار پردازنده منطقی را می شناسد و کار می کند. اما سیستم عامل سرور در یک ایستگاه کاری کمی عجیب به نظر می رسد (بدون ذکر جنبه های مالی). تنها مورد معقول این است که سیستم Xeon با پردازنده دوگانه ما به عنوان یک سرور عمل کند (حداقل برخی از کلکسیونرها قبلاً بدون تردید تولید سرورها را روی ایستگاه های کاری-پردازنده Xeon راه اندازی کرده اند). اما برای ایستگاه های کاری دوگانه با سیستم عامل های متناظر، کاربرد Hyper-Threading همچنان مشکوک است. اینتل اکنون فعالانه از صدور مجوز سیستم عامل بر اساس تعداد CPUهای نه منطقی، بلکه فیزیکی حمایت می کند. بحث‌ها هنوز ادامه دارد و به طور کلی، خیلی به این بستگی دارد که آیا سیستم‌عاملی برای ایستگاه‌های کاری با پشتیبانی از چهار پردازنده خواهیم دید یا خیر.

خوب، با سرورها، همه چیز کاملاً ساده ظاهر می شود. به عنوان مثال، یک سرور پیشرفته ویندوز 2000 که بر روی یک سیستم Xeon با پردازنده دوگانه با فعال بودن Hyper-Threading نصب شده است، چهار پردازنده منطقی را می بیند و به راحتی روی آن اجرا می شود. برای ارزیابی مزایای Hyper-Threading در سیستم‌های سرور، ما نتایج آزمایشگاه‌های نرم‌افزار میکروپروسسوری اینتل را برای سیستم‌های Xeon MP با پردازنده دوگانه و چندین برنامه سرور مایکروسافت ارائه می‌کنیم.

افزایش 20 تا 30 درصدی عملکرد برای سرور دو پردازنده "رایگان" بیش از حد وسوسه انگیز است (به ویژه در مقایسه با خرید یک سیستم 4 پردازنده "واقعی").

بنابراین معلوم می شود که در حال حاضر کاربرد عملی Hyper-Threading فقط در سرورها امکان پذیر است. مشکل ایستگاه های کاری به راه حل صدور مجوز سیستم عامل بستگی دارد. با این حال، یکی دیگر از کاربردهای Hyper-Threading کاملاً واقعی است - اگر پردازنده‌های دسکتاپ نیز از این فناوری پشتیبانی کنند. به عنوان مثال (بیایید خیال پردازی کنیم)، چرا سیستمی با پنتیوم 4 با پشتیبانی Hyper-Threading و Windows 2000 / XP Professional با پشتیبانی SMP نصب شده است؟ - از سرورها گرفته تا سیستم های دسکتاپ و موبایل.

  • آموزش

در این مقاله سعی خواهم کرد اصطلاحاتی را که برای توصیف سیستم هایی که قادر به اجرای چندین برنامه به صورت موازی هستند، یعنی چند هسته ای، چند پردازنده ای، چند رشته ای، توصیف کنم. انواع مختلف موازی سازی در CPU های IA-32 در زمان های مختلف و به شیوه ای ناسازگار ظاهر شده اند. گیج شدن در همه این موارد بسیار آسان است، به خصوص با توجه به اینکه سیستم عامل ها به دقت جزئیات را از برنامه های نه چندان پیچیده پنهان می کنند.

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

هشدار در مورد علائم ®، ™، در مقاله

نظر من توضیح می دهد که چرا کارکنان شرکت باید از علائم کپی رایت در ارتباطات عمومی استفاده کنند. در این مقاله، من مجبور شدم اغلب از آنها استفاده کنم.

CPU

البته قدیمی ترین، پرکاربردترین و بحث برانگیزترین اصطلاح «پردازنده» است.

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

سیستم های موبایل (تلفن، تبلت، لپ تاپ) و اکثر دسکتاپ ها دارای یک پردازنده واحد هستند. ایستگاه های کاری و سرورها گاهی اوقات دارای دو یا چند پردازنده در یک مادربرد هستند.

پشتیبانی از چندین CPU در یک سیستم نیازمند تغییرات طراحی متعددی است. حداقل، لازم است از اتصال فیزیکی آنها (ارائه چندین سوکت بر روی مادربرد)، حل مسائل مربوط به شناسایی پردازنده ها (به ادامه این مقاله و همچنین یادداشت قبلی من مراجعه کنید)، مذاکره در مورد دسترسی به حافظه و ارائه وقفه ها ( کنترل کننده وقفه باید قادر به مسیریابی وقفه ها برای چندین پردازنده) و البته پشتیبانی از سیستم عامل باشد. متأسفانه، من نتوانستم اشاره ای مستند به ایجاد اولین سیستم چند پردازنده ای بر روی پردازنده های اینتل پیدا کنم، با این حال، ویکی پدیا ادعا می کند که سیستم های کامپیوتری Sequent آنها را قبلاً در سال 1987 با استفاده از پردازنده های 80386 اینتل عرضه کرده است. پشتیبانی گسترده از چندین تراشه در یک سیستم در دسترس است. با Intel® Pentium شروع می شود.

اگر چندین پردازنده وجود داشته باشد، هر یک از آنها کانکتور مخصوص به خود را روی برد دارد. در عین حال، هر یک از آنها دارای کپی مستقل کامل از همه منابع مانند رجیسترها، مجریان، کش ها هستند. آنها یک حافظه مشترک دارند - RAM. حافظه را می توان به روش های مختلف و نسبتاً غیر پیش پا افتاده به آنها متصل کرد، اما این داستان جداگانه ای است که از حوصله این مقاله خارج است. مهم است که در هر سناریویی برای برنامه های اجرایی، توهم یک حافظه مشترک یکنواخت موجود از تمام پردازنده های موجود در سیستم ایجاد شود.


آماده برای پرواز! اینتل دسکتاپ برد D5400XS

هسته

از نظر تاریخی، چند هسته‌ای در Intel IA-32 دیرتر از Intel® HyperThreading ظاهر شد، اما در سلسله‌مراتب منطقی بعد از آن قرار می‌گیرد.

به نظر می رسد که اگر سیستم دارای پردازنده های بیشتری باشد، عملکرد آن بالاتر است (در کارهایی که می توانند از همه منابع استفاده کنند). با این حال، اگر هزینه ارتباط بین آنها خیلی زیاد باشد، تمام سود حاصل از موازی سازی با تاخیرهای طولانی در انتقال داده های مشترک از بین می رود. این دقیقاً همان چیزی است که در سیستم های چند پردازنده مشاهده می شود - هم از نظر فیزیکی و هم از نظر منطقی، آنها از یکدیگر بسیار دور هستند. برای برقراری ارتباط موثر در چنین محیطی، اتوبوس های تخصصی مانند Intel® QuickPath Interconnect باید اختراع شوند. مصرف انرژی، اندازه و قیمت راه حل نهایی، البته از این همه کاهش نمی یابد. ادغام بالای اجزا باید کمک کند - مدارهایی که بخش‌های یک برنامه موازی را اجرا می‌کنند باید به یکدیگر نزدیک‌تر شوند، ترجیحاً روی یک کریستال. به عبارت دیگر، یک پردازنده باید چندین را سازماندهی کند هسته ها، در همه چیز یکسان با یکدیگر هستند، اما به طور مستقل کار می کنند.

اولین پردازنده های چند هسته ای IA-32 اینتل در سال 2005 معرفی شدند. از آن زمان، میانگین تعداد هسته‌ها در پلتفرم‌های سرور، دسکتاپ و اکنون موبایل به‌طور پیوسته در حال رشد بوده است.

بر خلاف دو پردازنده تک هسته‌ای در یک سیستم، که فقط حافظه را به اشتراک می‌گذارند، دو هسته نیز می‌توانند حافظه پنهان و سایر منابعی را که مسئول تعامل با حافظه هستند به اشتراک بگذارند. اغلب، کش های سطح اول خصوصی باقی می مانند (هر هسته خود را دارد)، در حالی که سطح دوم و سوم می توانند به اشتراک گذاشته شوند یا جداگانه. این سازماندهی سیستم اجازه می دهد تا تاخیر در تحویل داده ها بین هسته های همسایه را کاهش دهد، به خصوص اگر آنها روی یک کار مشترک کار می کنند.


یک میکروگراف از یک پردازنده چهار هسته ای اینتل با نام رمز Nehalem. هسته‌های جداگانه، یک حافظه پنهان L3 مشترک، و همچنین پیوندهای QPI به دیگر پردازنده‌ها و یک کنترلر حافظه مشترک اختصاص داده شده است.

Hyperthreading

تا حدود سال 2002، تنها راه برای به دست آوردن یک سیستم IA-32 که قادر به اجرای دو یا چند برنامه به صورت موازی باشد، استفاده از سیستم های چند پردازنده ای بود. Intel® Pentium® 4، و همچنین خط Xeon، با نام رمز Foster (Netburst)، یک فناوری جدید - Hyperthreading یا Hyperthreading - Intel® HyperThreading (که از این پس HT نامیده می شود) معرفی کردند.

زیر آفتاب چیز جدیدی نیست. HT یک مورد خاص از آن چیزی است که ادبیات چند رشته ای همزمان (SMT) می نامد. برخلاف هسته‌های «واقعی» که کپی‌های کامل و مستقل هستند، در مورد HT، تنها بخشی از گره‌های داخلی در یک پردازنده کپی می‌شوند، که در درجه اول مسئول ذخیره‌سازی وضعیت معماری - ثبات‌ها است. گره‌های اجرایی مسئول سازمان‌دهی و پردازش داده‌ها به صورت مفرد باقی می‌مانند و در هر زمان معین حداکثر توسط یکی از رشته‌ها استفاده می‌شود. مانند کرنل ها، هایپرتردها کش ها را بین خود به اشتراک می گذارند، اما از چه سطحی به سیستم خاص بستگی دارد.

من سعی نمی کنم تمام جوانب مثبت و منفی طرح ها را با SMT به طور کلی و با HT به طور خاص توضیح دهم. خواننده علاقه مند می تواند در بسیاری از منابع، و البته در ویکی پدیا، بحث نسبتاً مفصلی درباره این فناوری پیدا کند. با این حال، من به نکته مهم زیر توجه خواهم کرد، که محدودیت های فعلی تعداد هایپرترد در محصولات واقعی را توضیح می دهد.

محدودیت های جریان
چه زمانی وجود چند هسته ای "ناصادق" در قالب HT توجیه می شود؟ اگر یک رشته برنامه قادر به بارگیری تمام گره های اجرایی در داخل هسته نباشد، می توان آنها را به رشته دیگری "قرض گرفت". این امر برای برنامه‌هایی که نه در محاسبات، بلکه در دسترسی به داده‌ها، «گلوگاه» دارند، معمول است، یعنی اغلب از دست دادن حافظه پنهان تولید می‌کنند و باید منتظر بمانند تا داده‌ها از حافظه تحویل داده شوند. در این زمان، هسته بدون HT مجبور به بیکار می شود. وجود HT به شما امکان می دهد تا به سرعت گره های اجرایی آزاد را به یک حالت معماری متفاوت تغییر دهید (از آنجایی که فقط تکرار شده است) و دستورالعمل های آن را اجرا کنید. این یک مورد خاص از تکنیکی به نام پنهان کردن تأخیر است، زمانی که یک عملیات طولانی، که در طی آن منابع مفید بیکار هستند، با اجرای موازی وظایف دیگر پوشانده می شود. اگر برنامه قبلاً از منابع هسته استفاده بالایی داشته باشد، وجود ابر رشته ها اجازه نمی دهد که سرعت آن افزایش یابد - در اینجا به هسته های "صادقانه" نیاز است.

سناریوهای کاربردی معمولی دسکتاپ و سرور برای معماری ماشین های همه منظوره دارای پتانسیل برای همزمانی فعال شده توسط HT هستند. با این حال، این پتانسیل به سرعت "استفاده می شود". شاید به همین دلیل، تقریباً در تمام پردازنده‌های IA-32، تعداد Hyperthread‌های سخت‌افزاری از 2 تجاوز نمی‌کند. در سناریوهای معمولی، سود حاصل از استفاده از سه یا چند ابر نخ کوچک است، اما از دست دادن اندازه کریستال، مصرف انرژی و هزینه قابل توجه است.

وضعیت متفاوتی در کارهای معمولی که روی شتاب دهنده های ویدیویی انجام می شود مشاهده می شود. بنابراین، این معماری ها با استفاده از تکنیک های SMT با تعداد زیادی رشته مشخص می شوند. از آنجایی که پردازنده های Intel® Xeon Phi (معرفی شده در سال 2010) از نظر ایدئولوژیکی و تبارشناسی کاملاً به کارت های ویدیویی نزدیک هستند، می توان آنها را چهار Hyperthreading در هر هسته - پیکربندی منحصر به فرد برای IA-32.

پردازنده منطقی

از سه "سطح" توصیف شده موازی (پردازنده ها، هسته ها، ابر رشته ها) ممکن است برخی یا همه آنها در یک سیستم خاص وجود نداشته باشند. این تحت تأثیر تنظیمات BIOS (چند هسته ای و چند رشته ای به طور مستقل غیرفعال هستند)، ویژگی های ریزمعماری (به عنوان مثال، HT در Intel® Core ™ Duo وجود نداشت، اما با انتشار Nehalem برگردانده شد) و رویدادهای سیستم (سرورهای چند پردازنده ای می توانند تبدیل شوند) تأثیر می گذارد. پردازنده های شکست خورده را در صورت نقص عملکرد خاموش کنید و در بقیه به "پرواز" ادامه دهید). چگونه این باغ وحش چند لایه همزمان برای سیستم عامل و در نهایت برای برنامه قابل مشاهده است؟

علاوه بر این، برای راحتی، تعداد پردازنده‌ها، هسته‌ها و رشته‌ها را در برخی از سیستم‌ها با سه برابر ( ایکس, y, z)، جایی که ایکستعداد پردازنده ها است yتعداد هسته های هر پردازنده است و z- تعداد Hyperthread ها در هر هسته. از این به بعد من این سه گانه را می نامم توپولوژی- یک اصطلاح کاملاً جا افتاده که ارتباط چندانی با بخش ریاضیات ندارد. کار کنید پ = xyzتعداد موجودیت های نامگذاری شده را مشخص می کند پردازنده های منطقیسیستم های. این تعداد کل زمینه های فرآیند برنامه همزمان مستقل را در یک سیستم حافظه مشترک که سیستم عامل مجبور به در نظر گرفتن آنها است، تعریف می کند. من می گویم "اجباری" زیرا نمی تواند ترتیب اجرای دو پردازش را در پردازنده های منطقی مختلف کنترل کند. این امر در مورد هایپر رشته ها نیز صدق می کند: اگرچه آنها به صورت "متوالی" روی یک هسته کار می کنند، اما ترتیب خاص توسط سخت افزار دیکته می شود و برای نظارت یا کنترل برنامه ها در دسترس نیست.

بیشتر اوقات، سیستم عامل ویژگی های توپولوژی فیزیکی سیستمی را که روی آن اجرا می شود از برنامه های نهایی پنهان می کند. به عنوان مثال، سه توپولوژی زیر: (2، 1، 1)، (1، 2، 1) و (1، 1، 2) - سیستم عامل به شکل دو پردازنده منطقی نمایش داده می شود، اگرچه اولین آنها دارای دو پردازنده، دومی - دو هسته، و سومی فقط دو رشته دارد.


Windows Task Manager 8 پردازنده منطقی را نشان می دهد. اما در پردازنده ها، هسته ها و هایپرتریدها چقدر است؟


بالای لینوکس 4 پردازنده منطقی را نشان می دهد.

این برای توسعه دهندگان برنامه کاملاً راحت است - آنها مجبور نیستند با ویژگی های سخت افزاری که اغلب به آنها بی ربط است سر و کار داشته باشند.

تعریف توپولوژی به صورت برنامه ای

البته، انتزاع توپولوژی به تعداد واحد پردازشگر منطقی در برخی موارد زمینه کافی برای سردرگمی و سوء تفاهم (در اختلافات داغ اینترنتی) ایجاد می کند. برنامه‌های محاسباتی که می‌خواهند حداکثر کارایی را از سخت‌افزار کم کنند، به کنترل دقیقی بر روی مکان قرارگیری رشته‌های آنها نیاز دارند: نزدیک‌تر به یکدیگر در ابر رشته‌های مجاور، یا برعکس، دورتر در پردازنده‌های مختلف. سرعت ارتباط بین پردازنده های منطقی در یک هسته یا پردازنده بسیار بیشتر از سرعت انتقال داده بین پردازنده ها است. امکان ناهمگونی در سازماندهی RAM نیز تصویر را پیچیده می کند.

اطلاعات مربوط به توپولوژی سیستم به عنوان یک کل، و همچنین موقعیت هر پردازنده منطقی در IA-32، با استفاده از دستورالعمل CPUID در دسترس است. از زمان ظهور اولین سیستم های چند پردازنده ای، طرح شناسایی منطقی پردازنده چندین بار گسترش یافته است. تا به امروز، بخش هایی از آن در برگه های 1، 4 و 11 CPUID موجود است. از فلوچارت زیر که از مقاله گرفته شده است، می توان کدام صفحه را تماشا کرد:

من در اینجا شما را با تمام جزئیات بخش های جداگانه این الگوریتم خسته نمی کنم. در صورت بروز علاقه، قسمت بعدی این مقاله را می توان به این موضوع اختصاص داد. من خواننده علاقه مند را به آن ارجاع می دهم که در آن تا حد امکان به این موضوع با جزئیات پرداخته شده است. در اینجا ابتدا به طور خلاصه توضیح خواهم داد که APIC چیست و چگونه با توپولوژی ارتباط دارد. سپس کار با ورق 0xB (یازده به اعشار)، که در حال حاضر آخرین کلمه در "apicostroenie" است را در نظر بگیرید.

APIC ID
APIC محلی (کنترل کننده وقفه قابل برنامه ریزی پیشرفته) دستگاهی است (در حال حاضر بخشی از پردازنده) که مسئول کار با وقفه هایی است که به یک پردازنده منطقی خاص می رسد. هر پردازنده منطقی APIC مخصوص به خود را دارد. و هر یک از آنها در سیستم باید یک مقدار APIC ID منحصر به فرد داشته باشد. این عدد توسط کنترل‌کننده‌های وقفه برای آدرس‌دهی هنگام تحویل پیام‌ها و سایر افراد (مثلاً سیستم عامل) برای شناسایی پردازنده‌های منطقی استفاده می‌شود. مشخصات این کنترلر وقفه از Intel 8259 PIC از Dual PIC، APIC و xAPIC به x2APIC تغییر یافته است.

در حال حاضر، عرض تعداد ذخیره شده در APIC ID به 32 بیت کامل رسیده است، اگرچه در گذشته به 16 بیت محدود شده بود و حتی قبل از آن - فقط 8 بیت. امروزه، بقایای دوران قدیم در سراسر CPUID پراکنده شده است، اما تمام 32 بیت APIC ID در CPUID.0xB.EDX برگردانده می شود. هر پردازنده منطقی که به طور مستقل دستور CPUID را اجرا می کند، مقدار خود را برمی گرداند.

روشن شدن روابط خانوادگی
مقدار APIC ID به خودی خود چیزی در مورد توپولوژی نمی گوید. برای اینکه بفهمید کدام دو پردازنده منطقی در یک پردازنده فیزیکی قرار دارند (یعنی "برادران" hyperthread ها هستند)، کدام دو در داخل یک پردازنده هستند و کدام یک در پردازنده های کاملاً متفاوت هستند، باید مقادیر APIC ID آنها را با هم مقایسه کنید. بسته به درجه رابطه، برخی از بیت های آنها یکسان خواهد بود. این اطلاعات در زیر لیست های CPUID.0xB وجود دارد که با استفاده از عملوند ECX کدگذاری می شوند. هر یک از آنها موقعیت میدان بیت یکی از سطوح توپولوژی را در EAX توصیف می کند (به طور دقیق تر، تعداد بیت هایی که باید در شناسه APIC به سمت راست منتقل شوند تا سطوح توپولوژی پایین تر حذف شوند) و همچنین نوع این سطح - hyperthread، هسته یا پردازنده - در ECX.

پردازنده های منطقی که در داخل یک هسته قرار دارند، بیت های APIC ID یکسانی خواهند داشت، به جز آنهایی که به فیلد SMT تعلق دارند. برای پردازنده های منطقی در همان پردازنده، همه بیت ها به جز فیلدهای Core و SMT. از آنجایی که تعداد فهرست‌های فرعی برای CPUID.0xB می‌تواند افزایش یابد، در صورت نیاز در آینده، این طرح امکان پشتیبانی از توصیف توپولوژی‌ها با سطوح بیشتر را فراهم می‌کند. علاوه بر این، امکان ورود سطوح متوسط ​​بین سطوح موجود نیز وجود خواهد داشت.

یک پیامد مهم سازماندهی این طرح این است که ممکن است "سوراخ" در مجموعه تمام شناسه های APIC همه پردازنده های منطقی در سیستم وجود داشته باشد. آنها به صورت متوالی پیش نمی روند. به عنوان مثال، در یک پردازنده چند هسته‌ای با HT خاموش، همه شناسه‌های APIC ممکن است زوج باشند، زیرا کمترین بیتی که مسئول کدگذاری عدد هایپراستریم است همیشه صفر خواهد بود.

توجه داشته باشید که CPUID.0xB تنها منبع اطلاعات در مورد پردازنده های منطقی موجود برای سیستم عامل نیست. لیستی از تمام پردازنده های موجود به همراه مقادیر APIC ID آنها در جدول MADT ACPI کدگذاری شده است.

سیستم عامل و توپولوژی

سیستم عامل ها اطلاعات توپولوژی پردازنده منطقی را از طریق رابط های خود به برنامه ها ارائه می دهند.

در لینوکس، اطلاعات توپولوژی در فایل شبه / proc / cpuinfo و خروجی فرمان dmidecode موجود است. در مثال زیر، من محتوای cpuinfo را در برخی از سیستم‌های چهار هسته‌ای بدون HT فیلتر می‌کنم و فقط ورودی‌های مرتبط با توپولوژی را باقی می‌گذارم:

متن پنهان

[ایمیل محافظت شده]: ~ $ cat / proc / cpuinfo | grep "پردازنده \ | فیزیکی \ id \ | خواهر و برادر \ | هسته \ | هسته \ | apicid" پردازنده: 0 شناسه فیزیکی: 0 خواهر و برادر: 4 شناسه هسته: 0 هسته پردازنده: 2 apicid: 0 apicid اولیه: 0 پردازنده: 1 شناسه فیزیکی: 0 خواهر و برادر: 4 شناسه هسته: 0 هسته cpu: 2 apicid: 1 apicid اولیه: 1 پردازنده: 2 شناسه فیزیکی: 0 خواهر و برادر: 4 شناسه هسته: 1 هسته پردازنده: 2 apicid: 2 apicid اولیه: 2 پردازنده: 3 شناسه فیزیکی: 0 خواهر و برادر: 4 شناسه هسته: 1 هسته cpu: 2 apicid: 3 apicid اولیه: 3

در FreeBSD، توپولوژی از طریق مکانیسم sysctl در متغیر kern.sched.topology_spec به عنوان XML گزارش می شود:

متن پنهان

[ایمیل محافظت شده]: ~ $ sysctl kern.sched.topology_spec kern.sched.topology_spec: 0, 1, 2, 3, 4, 5, 6, 7 0, 1, 2, 3, 4, 5, 6, 7 0, 1 گروه THREADگروه SMT 2, 3 گروه THREADگروه SMT 4, 5 گروه THREADگروه SMT 6, 7 گروه THREADگروه SMT

در MS Windows 8، اطلاعات توپولوژی را می توان در Task Manager مشاهده کرد.

مقالات مرتبط برتر