Введение
Техника повышения эффективности суперскалярных процессоров. Одновременная многопоточность (SMT) — это метод повышения общей эффективности суперскалярных процессоров, использующий аппаратную многопоточность. SMT позволяет нескольким независимым потокам выполнения более эффективно использовать ресурсы современных процессорных архитектур.
Simultaneous multithreading (SMT) is a technique for improving the overall efficiency of superscalar CPUs with hardware multithreading. SMT permits multiple independent threads of execution to better use the resources provided by modern processor architectures.
Подробности
Термин многопоточность неоднозначен, поскольку не только несколько потоков могут выполняться одновременно на одном ядре процессора, но и несколько задач (с разными таблицами страниц, разными сегментами состояния задач, разными кольцами защиты, разными разрешениями ввода-вывода и т. д.). Хотя они выполняются на одном ядре, они полностью изолированы друг от друга. Многопоточность по своей концепции схожа с вытесняющей многозадачностью, но реализуется на уровне потока исполнения в современных суперскалярных процессорах. Одновременная многопоточность (SMT) является одной из двух основных реализаций многопоточности, другой формой является временная многопоточность (также известная как суперпоточность). Во временной многопоточности только один поток инструкций может выполняться на любой стадии конвейера в каждый момент времени. При одновременной многопоточности инструкции из нескольких потоков могут выполняться на любой стадии конвейера одновременно. Это достигается без существенных изменений в базовой архитектуре процессора: основные необходимые дополнения – это возможность выборки инструкций из нескольких потоков за такт и увеличенный регистровый файл для хранения данных из нескольких потоков. Количество одновременно выполняемых потоков определяется разработчиками чипов. Обычно используется два потока на ядро процессора, но некоторые процессоры поддерживают гораздо больше. Поскольку это неизбежно увеличивает конкуренцию за общие ресурсы, оценка или согласование её эффективности может быть затруднено. Однако, измерения энергоэффективности SMT с параллельными нативными и управляемыми рабочими нагрузками на исторических 130 нм – 32 нм Intel SMT (гиперпоточность) показали, что в 45 нм и 32 нм реализациях SMT чрезвычайно энергоэффективна, даже с процессорами Atom, работающими последовательно. В современных системах SMT эффективно использует параллелизм с очень небольшим дополнительным динамическим энергопотреблением. То есть, даже когда прирост производительности минимален, экономия энергии может быть значительной. Первым крупным коммерческим микропроцессором, разработанным с использованием SMT, был Alpha 21464 (EV8). Этот микропроцессор был разработан DEC в сотрудничестве с Дином Талленом из Калифорнийского университета в Сан-Диего и Сьюзан Эггерс и Генри Леви из Вашингтонского университета. Микропроцессор так и не был выпущен, поскольку линейка микропроцессоров Alpha была прекращена незадолго до того, как HP приобрела Compaq, которая, в свою очередь, приобрела DEC. Работа Дина Талльсена также была использована для разработки гиперпоточных версий микропроцессоров Intel Pentium 4, таких как "Northwood" и "Prescott".
Современные коммерческие реализации
Intel Pentium 4 стал первым современным настольным процессором, реализовавшим одновременную многопоточность, начиная с модели 3,06 ГГц, выпущенной в 2002 году, и впоследствии внедренной в ряд других процессоров. Intel называет эту функциональность технологией Hyper Threading и предоставляет базовый двухпоточный SMT-движок. Intel заявляет о возможном увеличении производительности до 30% по сравнению с идентичным Pentium 4 без поддержки SMT. Фактическое увеличение производительности сильно зависит от приложения; однако, при одновременном запуске двух программ, интенсивно использующих процессор, может показаться, что одна или обе программы немного замедляются при включенной Hyper Threading. Это связано с системой повторного выполнения инструкций в Pentium 4, которая перегружает ценные ресурсы, увеличивая конкуренцию за пропускную способность, кэши, TLB, записи в буфер переупорядочивания и выравнивая ресурсы процессора между двумя программами, что добавляет переменное время выполнения. Ядро Pentium 4 Prescott получило очередь повторного выполнения, что сократило время, необходимое для системы повторного выполнения. Этого оказалось достаточно, чтобы полностью устранить снижение производительности. Новейшие разработки архитектуры MIPS от Imagination Technologies включают систему SMT, известную как "MIPS MT". MIPS MT обеспечивает поддержку как тяжеловесных виртуальных процессорных элементов, так и более легких аппаратных микропотоков. RMI, стартап из Купертино, является первым производителем MIPS, предложившим процессор SOC на основе восьми ядер, каждое из которых выполняет четыре потока. Потоки могут выполняться в режиме с мелкой гранулярностью, когда каждый цикл может выполняться другой поток. Потокам также можно назначать приоритеты. Процессоры MIPS от Imagination Technologies имеют два SMT-потока на ядро. IBM Blue Gene/Q использует 4-сторонний SMT. IBM POWER5, анонсированный в мае 2004 года, поставляется в виде двухъядерного модуля с двумя чипами (DCM) или четырехъядерного или восьмиядерного многочипового модуля (MCM), при этом каждое ядро включает двухпоточный SMT-движок. Реализация IBM более сложна, чем предыдущие, поскольку она может назначать различный приоритет различным потокам, имеет более тонкую гранулярность, а SMT-движок может динамически включаться и выключаться для более эффективного выполнения рабочих нагрузок, для которых процессор SMT не повышает производительность. Это вторая реализация IBM аппаратной многопоточности, доступной широкой публике. В 2010 году IBM выпустила системы на базе процессора POWER7 с восемью ядрами, каждое из которых имеет четыре одновременных интеллектуальных потока. Это переключает режим потокообразования между одним, двумя или четырьмя потоками в зависимости от количества процессуальных потоков, запланированных в данный момент. Это оптимизирует использование ядра для минимизации времени отклика или максимизации пропускной способности. IBM POWER8 имеет 8 интеллектуальных одновременных потоков на ядро (SMT8). IBM Z, начиная с процессора z13 в 2013 году, имеет два потока на ядро (SMT 2). Многие сообщали, что UltraSPARC T1 от Sun Microsystems (известный как "Niagara" до его выпуска 14 ноября 2005 года) и ныне несуществующий процессор под кодовым названием "Rock" (первоначально анонсированный в 2005 году, но отмененный в 2010 году после многочисленных задержек) являются реализациями SPARC, почти полностью ориентированными на использование SMT и CMP. Однако Niagara фактически не использует SMT. Sun называет эти комбинированные подходы "CMT", а общую концепцию - "Throughput Computing". Niagara имеет восемь ядер, но каждое ядро имеет только один конвейер, поэтому фактически использует многопоточность с мелкой гранулярностью. В отличие от SMT, где инструкции из нескольких потоков совместно используют окно выдачи каждого цикла, процессор использует политику циклического перебора для выдачи инструкций из следующего активного потока каждого цикла. Это делает его более похожим на процессор с конвейерной обработкой. Процессор Rock от Sun Microsystems отличается: он имеет более сложные ядра с несколькими конвейерами. SPARC T3 от Oracle имеет восемь потоков с мелкой гранулярностью на ядро; SPARC T4, SPARC T5, SPARC M5, M6 и M7 имеют восемь потоков с мелкой гранулярностью на ядро, из которых два могут выполняться одновременно. Fujitsu SPARC64 VI использует многопоточность с грубой гранулярностью и вертикальной структурой (VMT), SPARC VII и более новые версии используют 2-сторонний SMT. Intel Itanium Montecito использует многопоточность с грубой гранулярностью, а Tukwila и более новые версии используют 2-сторонний SMT (с многопоточностью с двойной областью). Intel Xeon Phi использует 4-сторонний SMT (с мультиплексированной по времени многопоточностью) с аппаратными потоками, которые нельзя отключить, в отличие от обычной Hyper Threading. Intel Atom, впервые выпущенный в 2008 году, является первым продуктом Intel с 2-сторонним SMT (маркетируемым как Hyper Threading) без поддержки переупорядочивания инструкций, спекулятивного выполнения или переименования регистров. Intel вернула Hyper Threading с микроархитектурой Nehalem после ее отсутствия в микроархитектуре Core. Микроархитектура AMD Bulldozer FlexFPU и общий L2-кэш являются многопоточными, но целочисленные ядра в модуле однопоточные, поэтому это лишь частичная реализация SMT. Микроархитектура AMD Zen имеет 2-сторонний SMT. Архитектура VISC использует виртуальный программный слой (слой трансляции) для отправки одного потока инструкций в глобальный Front End, который разделяет инструкции на виртуальные аппаратные потоки, которые затем отправляются на отдельные виртуальные ядра. Эти виртуальные ядра затем могут отправлять их на доступные ресурсы на любом из физических ядер. Несколько виртуальных ядер могут отправлять потоки в буфер переупорядочивания одного физического ядра, который может разделять частичные инструкции и данные из нескольких потоков через порты выполнения одновременно. Каждое виртуальное ядро отслеживает положение относительного вывода. Эта форма многопоточности может повысить производительность одного потока, позволяя одному потоку использовать все ресурсы ЦП. Распределение ресурсов динамическое на уровне задержки, близкой к одному циклу (1–4 цикла в зависимости от изменения распределения в зависимости от потребностей конкретного приложения). Поэтому, если два виртуальных ядра конкурируют за ресурсы, существуют соответствующие алгоритмы для определения того, какие ресурсы должны быть выделены где.
Недостатки
В зависимости от конструкции и архитектуры процессора, одновременная многопоточность может снизить производительность, если какой-либо из совместно используемых ресурсов становится узким местом. Критики утверждают, что возлагать на разработчиков программного обеспечения необходимость тестирования влияния одновременной многопоточности на производительность их приложений в различных ситуациях и внедрение дополнительной логики для её отключения в случае снижения производительности – значительная нагрузка. Современные операционные системы не предоставляют удобных API для этого, а также для предотвращения перехвата ресурсов процессами с разными приоритетами. Кроме того, существуют проблемы безопасности в некоторых реализациях одновременной многопоточности. В частности, технология Hyper-Threading от Intel в процессорах NetBurst имеет уязвимость, позволяющую одному приложению перехватить криптографический ключ из другого приложения, работающего на том же процессоре, путём мониторинга использования кэша. На конференции Black Hat 2018 также были представлены сложные эксплойты машинного обучения, использующие особенности реализации HT.