Многопоточность (компьютерная архитектура)

Процесс с двумя потоками выполнения, выполняемый на одном процессоре. Поток №1 выполняется первым, в конечном итоге запускает поток №2 и ждет ответа. Когда поток №2 завершается, он сигнализирует потоку №1 о возобновлении выполнения до завершения, а затем завершается.
Процесс с двумя потоками выполнения, выполняемый на одном процессоре

В компьютерной архитектуре многопоточность это способность центрального процессора (ЦП) (или одного ядра в многоядерном процессоре ) обеспечивать несколько потоков выполнения . Существует два распространенных подхода к многопоточности: параллельная многопоточность и параллельная многопоточность. [1]

Обзор [ править ]

многопоточности Парадигма стала более популярной, поскольку попытки дальнейшего использования параллелизма на уровне инструкций застопорились с конца 1990-х годов. Это позволило концепции вычислений с пропускной способностью вновь выйти из более специализированной области обработки транзакций . Несмотря на то, что очень сложно дополнительно ускорить один поток или одну программу, большинство компьютерных систем фактически выполняют многозадачность среди нескольких потоков или программ. Таким образом, методы, повышающие производительность всех задач, приводят к общему повышению производительности.

Двумя основными методами повышения пропускной способности являются многопоточность и многопроцессорность .

Преимущества [ править ]

Если поток получает много промахов в кэше , другие потоки могут продолжать использовать неиспользуемые вычислительные ресурсы, что может привести к более быстрому общему выполнению, поскольку эти ресурсы простаивали бы, если бы выполнялся только один поток. Кроме того, если поток не может использовать все вычислительные ресурсы ЦП (поскольку инструкции зависят от результатов друг друга), запуск другого потока может предотвратить простаивание этих ресурсов.

Недостатки [ править ]

Несколько потоков могут мешать друг другу при совместном использовании аппаратных ресурсов, таких как кэши или резервные буферы трансляции (TLB). В результате время выполнения одного потока не улучшается и может ухудшиться, даже когда выполняется только один поток, из-за более низких частот или дополнительных этапов конвейера, которые необходимы для размещения оборудования переключения потоков.

Общая эффективность варьируется; Intel заявляет об улучшении производительности до 30% благодаря технологии Hyper-Threading . [2] в то время как синтетическая программа, просто выполняющая цикл неоптимизированных зависимых операций с плавающей запятой, фактически получает 100% -ное увеличение скорости при параллельном запуске. С другой стороны, настроенные вручную на языке ассемблера программы , использующие расширения MMX или AltiVec и выполняющие предварительную выборку данных (как это может делать хороший видеокодер), не страдают от промахов в кэше или простоя вычислительных ресурсов. Таким образом, такие программы не получают преимуществ от аппаратной многопоточности и действительно могут наблюдать снижение производительности из-за конкуренции за общие ресурсы.

С точки зрения программного обеспечения, аппаратная поддержка многопоточности более заметна для программного обеспечения и требует большего количества изменений как в прикладных программах, так и в операционных системах, чем многопроцессорность. Аппаратные методы, используемые для поддержки многопоточности, часто параллельны программным методам, используемым для многозадачности компьютеров . Планирование потоков также является серьезной проблемой в многопоточности.

Типы многопоточности [ править ]

Чередованная/временная многопоточность [ править ]

Грубая многопоточность [ править ]

Самый простой тип многопоточности возникает, когда один поток выполняется до тех пор, пока не будет заблокирован событием, которое обычно приводит к остановке с большой задержкой. Такой остановкой может быть промах в кэше, из-за которого требуется доступ к внешней памяти, что может потребовать сотен циклов ЦП для возврата данных. Вместо того, чтобы ждать разрешения остановки, многопоточный процессор переключал выполнение на другой поток, который был готов к запуску. Только когда данные для предыдущего потока поступят, предыдущий поток будет снова помещен в список готовых к выполнению потоков.

Например:

  1. Цикл i : инструкция j из потока A. выдается
  2. Цикл i + 1 инструкция j + 1 из потока A. : выдается
  3. Цикл i +2 : инструкция j +2 из потока A , которая представляет собой инструкцию загрузки, которая отсутствует во всех кэшах. выдается
  4. Цикл i + 3 : вызывается планировщик потоков, переключается на B. поток
  5. Цикл i + 4 : инструкция k из потока B. выдается
  6. Цикл i + 5 инструкция k + 1 из потока B. : выдается

Концептуально это похоже на совместную многозадачность, используемую в операционных системах реального времени , в которой задачи добровольно отказываются от времени выполнения, когда им нужно дождаться определенного типа события. Этот тип многопоточности известен как блочная, кооперативная или крупнозернистая многопоточность.

Цель аппаратной поддержки многопоточности — обеспечить быстрое переключение между заблокированным потоком и другим потоком, готовым к запуску. Переключение с одного потока на другой означает, что аппаратное обеспечение переключается с использования одного набора регистров на другой. Для достижения этой цели реплицируется аппаратное обеспечение видимых регистров программы, а также некоторых регистров управления процессором (таких как программный счетчик). Например, для быстрого переключения между двумя потоками процессор оснащен двумя наборами регистров.

Дополнительная аппаратная поддержка многопоточности позволяет выполнять переключение потоков за один цикл ЦП, что повышает производительность. Кроме того, дополнительное оборудование позволяет каждому потоку вести себя так, как если бы он выполнялся отдельно и не делился какими-либо аппаратными ресурсами с другими потоками, что сводит к минимуму количество изменений программного обеспечения, необходимых в приложении и операционной системе для поддержки многопоточности.

Многие семейства микроконтроллеров и встроенных процессоров имеют несколько банков регистров, позволяющих быстро переключать контекст для прерываний. Такие схемы можно рассматривать как разновидность блочной многопоточности между потоком пользовательской программы и потоками прерываний. [ нужна ссылка ]

Мелкозернистая многопоточность [ править ]

Целью мелкозернистой многопоточности является устранение всех зависаний зависимостей данных из конвейера выполнения . Поскольку один поток относительно независим от других потоков, вероятность того, что одной инструкции на одном этапе конвейерной обработки потребуются выходные данные более старой инструкции в конвейере, меньше. Концептуально это похоже на вытесняющую многозадачность, используемую в операционных системах; аналогией может служить то, что интервал времени, отдаваемый каждому активному потоку, составляет один цикл ЦП.

Например:

  1. Цикл i + 1 инструкция из потока B. : выдается
  2. Цикл i + 2 инструкция из потока C. : выдается

Этот тип многопоточности сначала назывался бочковой обработкой, в которой элементы бочки представляют этапы конвейера и их исполняющие потоки. Чередованная, вытесняющая, мелкозернистая или временная многопоточность — это более современная терминология.

В дополнение к затратам на оборудование, обсуждаемым в многопоточности блочного типа, чередующаяся многопоточность требует дополнительных затрат на каждом этапе конвейера, отслеживающем идентификатор потока инструкции, которую он обрабатывает. Кроме того, поскольку в конвейере одновременно выполняется больше потоков, общие ресурсы, такие как кэши и TLB, должны быть больше, чтобы избежать перераспределения между различными потоками.

Одновременная многопоточность [ править ]

Самый продвинутый тип многопоточности применяется к суперскалярным процессорам . В то время как обычный суперскалярный процессор выдает несколько инструкций из одного потока за каждый цикл ЦП, при одновременной многопоточности (SMT) суперскалярный процессор может выдавать инструкции из нескольких потоков за каждый цикл ЦП. Признавая, что любой отдельный поток имеет ограниченный объем параллелизма на уровне инструкций , этот тип многопоточности пытается использовать параллелизм, доступный в нескольких потоках, чтобы уменьшить потери, связанные с неиспользуемыми слотами задач.

Например:

  1. Цикл i : инструкции j и j +1 из потока A и инструкция k из потока B. одновременно выдаются
  2. Цикл i + 1 : инструкция j + 2 из потока A , инструкция k + 1 из потока B и инструкция m из потока C выполняются одновременно.
  3. Цикл i + 2 : инструкция j + 3 из потока A и инструкции m + 1 и m + 2 из потока C выполняются одновременно.

Чтобы отличить другие типы многопоточности от SMT, термин « временная многопоточность » используется для обозначения случаев, когда одновременно могут быть выданы инструкции только из одного потока.

В дополнение к затратам на оборудование, обсуждаемым для чередующейся многопоточности, SMT имеет дополнительные затраты на каждый этап конвейера, отслеживающий идентификатор потока каждой обрабатываемой инструкции. Опять же, общие ресурсы, такие как кэши и TLB, должны быть рассчитаны на большое количество обрабатываемых активных потоков.

Внедрения включают DEC (позже Compaq ) EV8 (не завершено), Intel Hyper-Threading Technology , IBM POWER5 / POWER6 / POWER7 / POWER8 / POWER9 , IBM z13 / z14 / z15 , Sun Microsystems UltraSPARC T2 , Cray XMT и AMD Bulldozer и Zen. микроархитектуры.

Особенности реализации [ править ]

Основной областью исследований является планировщик потоков, который должен быстро выбирать из списка готовых к запуску потоков для выполнения следующим, а также поддерживать списки готовых к запуску и остановленных потоков. Важным подтемом являются различные схемы приоритетов потоков, которые может использовать планировщик. Планировщик потоков может быть реализован полностью программно, полностью аппаратно или в виде комбинации аппаратно-программного обеспечения.

Другая область исследований — события какого типа должны вызывать переключение потока: промахи в кэше, межпотоковая связь, DMA завершение и т. д.

Если схема многопоточности реплицирует все видимое для программного обеспечения состояние, включая регистры привилегированного управления и TLB, то она позволяет виртуальные машины создавать для каждого потока. Это позволяет каждому потоку запускать свою собственную операционную систему на одном процессоре. С другой стороны, если сохраняется только состояние пользовательского режима, то требуется меньше оборудования, что позволит одновременно активировать больше потоков при той же площади кристалла или затратах.

См. также [ править ]

Ссылки [ править ]

  1. ^ Искусство параллелизма. Руководство Thread Monkey по написанию параллельных приложений . О'Рейли Медиа. 2009. ISBN  9780596555788 .
  2. ^ «Технология Intel Hyper-Threading, Техническое руководство пользователя» (PDF) . п. 13. Архивировано из оригинала (PDF) 21 августа 2010 г.

Внешние ссылки [ править ]