Микропотоки для многоядерных и многоядерных процессоров — это механизм скрытия задержки памяти, аналогичный многопоточным архитектурам. Однако это делается в программном обеспечении для многоядерных процессоров, таких как Cell Broadband Engine, чтобы динамически скрывать задержки, возникающие из-за задержки памяти или операций ввода-вывода.
Микропоточность — это программная потоковая структура, которая создает небольшие потоки внутри многоядерных или многоядерных процессоров. Каждое ядро может иметь два или более крошечных потока, которые используют его время простоя. Это похоже на гиперпоточность, изобретенную Intel, или общую многопоточную архитектуру в современных микропроцессорах. Она обеспечивает существование более одного потока, работающего на одном ядре, без выполнения дорогостоящего переключения контекста в основную память системы, даже если это ядро не имеет многопоточной аппаратной логики . Микропотоки в основном скрывают задержку памяти внутри каждого ядра путем перекрытия вычислений с запросами памяти. Главное отличие между микропотоками и текущими моделями потоков заключается в том, что накладные расходы на переключение контекста микропотоков очень малы. Например, накладные расходы на реализацию микропотоков в Cell Broadband Engine составляют 160 наносекунд; в то же время накладные расходы на переключение контекста всего потока ядра (SPE) составляют около 2000 микросекунд. Эти низкие накладные расходы обусловлены тремя основными факторами. Во-первых, микропотоки очень малы. Каждый микропоток выполняет одну или две простые, но критически важные функции. Во-вторых, контекст микропотоков включает только файл регистра ядра, на котором в данный момент выполняется микропоток. В-третьих, контекст микропотоков переключается на выделенный кэш ядра, что делает этот процесс очень быстрым и эффективным.
Поскольку микропроцессоры становятся быстрее, в основном из-за того, что ядра добавляются каждые несколько месяцев, разрыв в задержке памяти становится больше. Задержка памяти составляла несколько циклов в 1980 году, а в настоящее время она достигает почти 1000 циклов. Если у микропроцессора достаточно ядер и, как мы надеемся, они не отправляют запросы в основную память одновременно, будет частичное совокупное сокрытие задержки памяти. Некоторые ядра могут выполняться, пока другие ждут ответа памяти. Это не лучшая ситуация для многоядерных процессоров. Эксперты по высокопроизводительным вычислениям стремятся держать все ядра занятыми все время. Таким образом, если каждое ядро будет постоянно занято, возможно полное использование всего микропроцессора. Создание программных потоков не решит проблему по одной очевидной причине. Переключение потоков контекста в основную память является гораздо более дорогой операцией по сравнению с задержкой памяти. Например, в Cell Broadband Engine переключение контекста любого потока ядра занимает 2000 микросекунд в лучшем случае. Некоторые программные методы, такие как двойная или мультибуферизация, могут решить проблему задержки памяти. Однако их можно использовать в обычных алгоритмах, где программа знает, где находится следующий фрагмент данных для извлечения из памяти; в этом случае она отправляет запрос в память, пока обрабатывает ранее запрошенные данные. Однако этот метод не будет работать, если программа не знает следующий фрагмент данных для извлечения из памяти. Другими словами, он не будет работать в комбинаторных алгоритмах, таких как охватывание дерева или ранжирование случайных списков. Кроме того, мультибуферизация предполагает, что задержка памяти постоянна и может быть скрыта статически. Однако реальность показывает, что задержка памяти меняется от приложения к приложению. Она зависит от общей нагрузки на общие ресурсы микропроцессора, например, от скорости запросов памяти и общих ядер.
В настоящее время микропоточность реализована на Cell Broadband Engine . [1] Можно достичь трех-пятикратного улучшения производительности. В настоящее время это доказано для обычных и комбинаторных алгоритмов. Некоторые другие усилия пытаются доказать его жизнеспособность для научных алгоритмов.
Микропотоки обеспечивают очень хорошее решение для сокрытия задержки памяти, наилучшим образом основанное на использовании микропроцессора во время выполнения. Например, если задержка памяти очень высока по сравнению со временем обработки и переключения контекста, можно добавить больше микропотоков; это происходит, когда из памяти запрашиваются большие порции данных или есть много точек доступа к памяти. Если это соотношение мало, во время выполнения может быть введено меньше микропотоков. Это зависит от факторов, связанных с реализованным приложением и факторами времени выполнения системы.
Хотя микропотоки представляют собой многообещающую модель для скрытия задержек памяти для многоядерных и многоядерных процессоров, у нее есть несколько важных замечаний, которые необходимо рассмотреть: