Предполагая, что запросы кэш-памяти l1 и l2 приводят к пропаданию, процессор останавливается до тех пор, пока к основной памяти не обращаются?
Я слышал об идее переключения на другой поток, если так, что используется, чтобы пробудить остановленный поток?
computer-architecture
cpu-cache
cpu-pipelines
102948239408
источник
источник
Ответы:
Задержка памяти является одной из фундаментальных проблем, изучаемых в исследованиях компьютерной архитектуры.
Спекулятивное исполнение
Спекулятивное выполнение с проблемой неупорядоченных команд часто может найти полезную работу, чтобы заполнить задержку во время обращения к кэш-памяти L1, но обычно заканчивается полезная работа после 10 или 20 циклов или около того. Было несколько попыток увеличить объем работы, которую можно выполнить во время промаха с большим временем ожидания. Одна идея состояла в том, чтобы попытаться сделать ценностное предсказание (Липасти, Уилкерсон и Шен, (ASPLOS-VII): 138-147, 1996). Эта идея была очень модной в научных кругах академической архитектуры некоторое время, но, похоже, не работает на практике. Последней попыткой сохранить предсказание значения из мусорной корзины истории было предвкушение выполнения(Мутлу, Старк, Уилкерсон и Патт (HPCA-9): 129, 2003). В выполнении runahead вы понимаете, что ваши предсказания значений будут неправильными, но все равно спекулятивно выполняете их, а затем отбрасываете всю работу, основанную на предсказании, исходя из теории, что вы по крайней мере запустите некоторые предварительные выборки для того, что в противном случае было бы кешем L2 промахов. Оказывается, ранада впустую тратит столько энергии, что просто не стоит этого.
Последний подход в этом направлении, который может получить некоторую популярность в промышленности, заключается в создании чрезвычайно длинных буферов переупорядочения. Инструкции выполняются спекулятивно на основе прогнозирования ветвлений, но прогнозирование значений не выполняется. Вместо этого все инструкции, которые зависят от загрузки с большим временем ожидания, сидят и ждут в буфере переупорядочения. Но поскольку буфер переупорядочения настолько велик, вы можете продолжать извлекать инструкции, если предиктор ветвления делает достойную работу, иногда вы сможете найти полезную работу намного позже в потоке команд. Влиятельным исследовательским документом в этой области были Continuous Flow Pipelines(Шринивасан, Раджвар, Аккари, Ганди и Аптон (АСПЛОС-XI): 107-119, 2004). (Несмотря на то, что все авторы принадлежат Intel, я думаю, что эта идея получила большее распространение в AMD.)
Многопоточность
Использование нескольких потоков для обеспечения устойчивости к задержкам имеет гораздо более длительную историю и гораздо больший успех в промышленности. Все успешные версии используют аппаратную поддержку многопоточности. Самая простая (и наиболее успешная) версия этого - то, что часто называют FGMT ( мелкозернистая многопоточность ) или чередованная многопоточность . Каждое аппаратное ядро поддерживает несколько потоковых контекстов ( контекст по сути является состоянием регистра, включая регистры, такие как указатель команд и любые регистры неявных флагов). В мелкозернистом многопоточном процессоре каждый поток обрабатывается в-приказ. Процессор отслеживает, какие потоки остановились при пропадании нагрузки с большим временем ожидания, а какие готовы к следующей инструкции, и использует простую стратегию планирования FIFO для каждого цикла, чтобы выбрать, какой готовый поток выполнить этот цикл. Первым примером этого в широком масштабе были HEP-процессоры Burton Smith (Burton Smith продолжил разработку суперкомпьютера Tera, который также был мелкозернистым многопоточным процессором). Но идея уходит гораздо дальше, в 1960-е годы, я думаю.
FGMT особенно эффективен при потоковых рабочих нагрузках. Все современные графические процессоры (графические процессоры) являются многоядерными, где каждое ядро является FGMT, и эта концепция также широко используется в других вычислительных областях. Sun T1 также был многоядерным FMGT, как и Intel Xeon Phi (процессор, который до сих пор называют «MIC» и раньше называли «Larabee»).
Идея одновременной многопоточности (Tullsen, Eggers и Levy, (ISCA-22): 392-403, 1995) объединяет аппаратную многопоточность со спекулятивным исполнением. Процессор имеет несколько контекстов потока, но каждый поток выполняется спекулятивно и не по порядку. Более сложный планировщик может затем использовать различные эвристические методы для извлечения из потока, который, скорее всего, будет полезен ( Малик, Агарвал, Дар и Фрэнк, (HPCA-14: 50-61), 2008 ). Некоторая крупная полупроводниковая компания начала использовать термин гиперпоточность для одновременной многопоточности, и это имя, по-видимому, является наиболее широко используемым в наши дни.
Микроархитектурные проблемы низкого уровня
После перечитывания ваших комментариев я понял, что вы также заинтересованы в передаче сигналов между процессором и памятью. Современные кэши обычно допускают одновременное выполнение нескольких промахов. Это называется кешем без блокировки (Kroft, (ISCA-8): 81-87, 1981). (Но документ трудно найти в Интернете, и его довольно сложно прочитать. Краткий ответ: ведется много бухгалтерского учета, но вы просто с этим справляетесь. Структура аппаратного учета называется MSHR (отсутствует информация / регистр хранения статуса). ), это имя Крофт дал в своей статье 1981 года.)
источник
Короткий ответ: ничего, процессор глохнет.
Там не так много возможностей. Переключение на другую задачу на самом деле не вариант по двум причинам. Это дорогостоящая операция, и поскольку текущая задача и другая задача конкурируют за место в кеше, переключение на другую задачу может само по себе потребовать доступ к основной памяти, а также может вернуться к исходной задаче. Кроме того, для этого потребуется задействовать операционную систему, поэтому процессор должен будет инициировать некоторую форму прерывания или прерывания - фактически процессор будет переключаться на некоторый код ядра.
Пока процессор остановлен, таймер продолжает работать, поэтому может быть прерывание таймера или прерывание от других периферийных устройств. Таким образом, переключение контекста с большей вероятностью происходит во время доступа к основной памяти, чем при обращении к кэшу, но только потому, что это занимает больше времени.
Тем не менее современные компьютеры включают в себя множество методов, позволяющих сократить время, затрачиваемое процессором на ожидание основной памяти. Срыв происходит, но только тогда, когда его невозможно избежать.
Один из методов - спекулятивные выборки : процессор пытается угадать, к какой ячейке памяти будет осуществляться доступ, и забирает ее для кэширования заранее. Например, циклы над блоком памяти являются общими, поэтому, если строки кэша были загружены для адресов памяти 0x12340000, 0x12340010 и 0x12340020, было бы неплохо загрузить строку для 0x12340030. Компилятор может помочь, генерируя инструкции предварительной выборки, которые похожи на нагрузки, за исключением того, что они передают данные только из основной памяти в кэш, а не в регистр процессора.
Другая техника - умозрительное исполнение . Процессор начинает выполнять следующую инструкцию до загрузки. В любом случае это происходит естественным образом из-за конвейеризации инструкций. Только инструкции, которые не зависят от загруженного значения, могут быть выполнены таким образом: процессор должен выполнить анализ зависимостей. Для условных инструкций (например, загрузка r1; переход, если r1 ≠ 0), процессоры используют эвристику предсказания переходов, чтобы угадать, какое значение будет. Спекулятивное выполнение после загрузки может потребоваться перемотать в случае, если загрузка вызывает прерывание.
Некоторые архитектуры, такие как Itanium, облегчают выполнение инструкций в удобном порядке, позволяя переупорядочивать команды по умолчанию: вместо того, чтобы состоять из последовательности элементарных инструкций, которые семантически выполняются одна за другой, программы состоят из очень длинных командных слов : одна инструкция включает множество операций, которые должны выполняться параллельно различными компонентами процессора.
Переключение на другой поток происходит в гиперпоточности , встречающейся на высокопроизводительных процессорах x86. Это метод проектирования аппаратного обеспечения: каждое ядро процессора содержит два отдельных банка регистров (каждый соответствует контексту задачи), но один экземпляр других элементов, так что он может поддерживать два независимых потока выполнения, но эффективно выполнять команды только от одного в время. Пока один поток останавливается, другой поток продолжается. С точки зрения программного обеспечения существует два независимых процессора; Просто так получилось, что эти процессоры имеют много общих компонентов.
Обмен - это еще один уровень в иерархии кеша памяти: основная память может рассматриваться как кеш для пространства подкачки. При замене механизмы и показатели производительности различаются. Если для задачи требуется загрузка данных из подкачки, инструкция загрузки запускает ловушку, которая выполняет код ядра для выделения страницы в ОЗУ и загрузки ее содержимого с диска. Пока это происходит, ядро вполне может решить переключиться на другую задачу.
источник
Ответ на этот вопрос зависит от конкретной архитектуры. В то время как многие процессоры останавливаются (ARM, x86 без гиперпоточности и т. Д.), Так как им требуется слишком много времени для переключения потоков, это не тот подход, который используется в каждой архитектуре. В некоторых архитектурах каждый поток, запланированный на ЦП, имеет свой собственный независимый регистровый файл, поэтому процессор может просто выполнять работу из потока, который не ожидает доступа к памяти. Насколько я понимаю, это в некоторой степени то, что делает гиперпоточность x86 (используя только 2 потока), но это гораздо чаще встречается в GPGPUархитектуры. В конкретном случае CUDA, по меньшей мере, десятки, если не сотни, перекосов потоков обычно загружаются в данный мультипроцессор в любой момент времени, причем каждый поток (сотни или тысячи из них) имеет свои собственные регистры. Это позволяет архитектуре выполнять инструкцию из другого потока в следующем цикле, когда данный поток выдает доступ к памяти. Таким образом, до тех пор, пока загружено достаточно много потоков, ядра процессора никогда не простаивают для доступа к памяти. См. Рекомендации по производительности и Иерархия памяти для получения дополнительной информации.
источник