В компьютерной архитектуре многопоточность — это способность центрального процессора (ЦП) (или одного ядра в многоядерном процессоре ) обеспечивать несколько потоков выполнения .
Парадигма многопоточности стала более популярной, поскольку попытки дальнейшего использования параллелизма на уровне инструкций застопорились с конца 1990-х годов. Это позволило концепции пропускной способности вычислений вновь возникнуть из более специализированной области обработки транзакций . Несмотря на то, что очень сложно дополнительно ускорить один поток или одну программу, большинство компьютерных систем фактически являются многозадачными среди нескольких потоков или программ. Таким образом, методы, которые улучшают пропускную способность всех задач, приводят к общему повышению производительности.
Двумя основными методами повышения пропускной способности вычислений являются многопоточность и многопроцессорность .
Если поток получает много промахов кэша , другие потоки могут продолжать использовать неиспользуемые вычислительные ресурсы, что может привести к более быстрому общему выполнению, поскольку эти ресурсы простаивали бы, если бы выполнялся только один поток. Кроме того, если поток не может использовать все вычислительные ресурсы ЦП (потому что инструкции зависят от результата друг друга), запуск другого потока может предотвратить простаивание этих ресурсов.
Несколько потоков могут мешать друг другу при совместном использовании аппаратных ресурсов, таких как кэши или буферы трансляции (TLB). В результате время выполнения одного потока не улучшается и может ухудшиться, даже если выполняется только один поток, из-за более низких частот или дополнительных этапов конвейера, необходимых для размещения оборудования переключения потоков.
Общая эффективность варьируется; Intel заявляет об улучшении до 30% с помощью своей технологии Hyper-Threading [1] , в то время как синтетическая программа, просто выполняющая цикл неоптимизированных зависимых операций с плавающей точкой, на самом деле получает 100%-ное улучшение скорости при параллельном запуске. С другой стороны, настроенные вручную программы на языке ассемблера , использующие расширения MMX или AltiVec и выполняющие предварительную выборку данных (как это может сделать хороший видеокодер), не страдают от промахов кэша или бездействующих вычислительных ресурсов. Таким образом, такие программы не получают выгоды от аппаратной многопоточности и действительно могут увидеть снижение производительности из-за конкуренции за общие ресурсы.
С точки зрения программного обеспечения, аппаратная поддержка многопоточности более заметна для программного обеспечения, требуя больше изменений как в прикладных программах, так и в операционных системах, чем многопроцессорность. Аппаратные методы, используемые для поддержки многопоточности , часто параллельны программным методам, используемым для многозадачности компьютера . Планирование потоков также является серьезной проблемой в многопоточности.
Самый простой тип многопоточности происходит, когда один поток выполняется до тех пор, пока он не будет заблокирован событием, которое обычно создает остановку с большой задержкой. Такой остановкой может быть промах кэша, который должен получить доступ к внешней памяти, что может занять сотни циклов ЦП для возврата данных. Вместо того, чтобы ждать разрешения останова, потоковый процессор переключает выполнение на другой поток, который готов к запуску. Только после поступления данных для предыдущего потока предыдущий поток будет помещен обратно в список готовых к запуску потоков.
Например:
Концептуально это похоже на кооперативную многозадачность, используемую в операционных системах реального времени , в которой задачи добровольно отказываются от времени выполнения, когда им нужно дождаться какого-либо типа события. Этот тип многопоточности известен как блочная, кооперативная или крупнозернистая многопоточность.
Цель поддержки многопоточности оборудования — обеспечить быстрое переключение между заблокированным потоком и другим потоком, готовым к запуску. Переключение с одного потока на другой означает, что оборудование переключается с использования одного набора регистров на другой. Для достижения этой цели оборудование для регистров, видимых программой, а также некоторые регистры управления процессором (такие как счетчик программ) реплицируются. Например, для быстрого переключения между двумя потоками процессор построен с двумя наборами регистров.
Дополнительная аппаратная поддержка многопоточности позволяет выполнять переключение потоков за один цикл ЦП, что повышает производительность. Кроме того, дополнительное оборудование позволяет каждому потоку вести себя так, как будто он выполняется в одиночку и не разделяет аппаратные ресурсы с другими потоками, сводя к минимуму количество программных изменений, необходимых в приложении и операционной системе для поддержки многопоточности.
Многие семейства микроконтроллеров и встроенных процессоров имеют несколько банков регистров, что позволяет быстро переключать контекст для прерываний. Такие схемы можно считать типом блочной многопоточности между потоком пользовательской программы и потоками прерываний. [ необходима цитата ]
Цель мелкозернистой многопоточности — удалить все задержки , связанные с зависимостью данных, из конвейера выполнения . Поскольку один поток относительно независим от других потоков, меньше вероятность того, что одной инструкции на одном этапе конвейеризации понадобится вывод из более старой инструкции в конвейере. Концептуально это похоже на упреждающую многозадачность, используемую в операционных системах; аналогия заключается в том, что временной отрезок, выделяемый каждому активному потоку, составляет один цикл ЦП.
Например:
Этот тип многопоточности сначала назывался обработкой ствола, в которой этапы ствола представляют этапы конвейера и их исполняющие потоки. Более современная терминология — чередующаяся, вытесняющая, мелкозернистая или временная многопоточность.
В дополнение к аппаратным расходам, обсуждаемым в блочном типе многопоточности, чередующаяся многопоточность имеет дополнительные расходы на отслеживание идентификатора потока каждой стадии конвейера для обрабатываемой им инструкции. Кроме того, поскольку в конвейере одновременно выполняется больше потоков, общие ресурсы, такие как кэши и TLB, должны быть больше, чтобы избежать перегрузки между различными потоками.
Самый продвинутый тип многопоточности применяется к суперскалярным процессорам . В то время как обычный суперскалярный процессор выдает несколько инструкций из одного потока за каждый цикл ЦП, в одновременной многопоточности (SMT) суперскалярный процессор может выдавать инструкции из нескольких потоков за каждый цикл ЦП. Признавая, что любой отдельный поток имеет ограниченный объем параллелизма на уровне инструкций , этот тип многопоточности пытается использовать параллелизм, доступный в нескольких потоках, чтобы уменьшить отходы, связанные с неиспользуемыми слотами выдачи.
Например:
Чтобы отличить другие типы многопоточности от SMT, используется термин « временная многопоточность », обозначающий ситуацию, когда одновременно могут выдаваться инструкции только из одного потока.
В дополнение к аппаратным расходам, обсуждаемым для чередующейся многопоточности, SMT имеет дополнительные расходы на отслеживание идентификатора потока каждой обрабатываемой инструкции на каждом этапе конвейера. Опять же, общие ресурсы, такие как кэши и TLB, должны быть рассчитаны на большое количество активных обрабатываемых потоков.
Реализации включают DEC (позже Compaq ) EV8 (не завершено), технологию Intel Hyper-Threading , IBM POWER5 / POWER6 / POWER7 / POWER8 / POWER9 , IBM z13 / z14 / z15 , Sun Microsystems UltraSPARC T2 , Cray XMT и микроархитектуры AMD Bulldozer и Zen .
Основная область исследований — планировщик потоков, который должен быстро выбирать из списка готовых к запуску потоков для выполнения следующим, а также поддерживать списки готовых к запуску и остановленных потоков. Важная подтема — различные схемы приоритетов потоков, которые может использовать планировщик. Планировщик потоков может быть реализован полностью в программном обеспечении, полностью в оборудовании или как комбинация оборудования и программного обеспечения.
Еще одна область исследований — какой тип событий должен вызывать переключение потоков: промахи кэша, межпотоковое взаимодействие, завершение DMA и т. д.
Если многопоточная схема реплицирует все видимое для программного обеспечения состояние, включая привилегированные регистры управления и TLB, то она позволяет создавать виртуальные машины для каждого потока. Это позволяет каждому потоку запускать свою собственную операционную систему на том же процессоре. С другой стороны, если сохраняется только состояние пользовательского режима, то требуется меньше оборудования, что позволяет большему количеству потоков быть активными одновременно для той же площади кристалла или стоимости.