Страница 4 из 8 Организация системы внеочередного исполнения инструкций
Организация системы внеочередного исполнения инструкций в виде многоуровневой структуры с раздельными очередями для разных групп функциональных устройств позволяет обеспечить работу процессора на повышенной тактовой частоте за счёт того, что на каждом этапе при работе с очередями и устройствами выполняются только простые действия. Например, для распределения трёх новых МОПов в амортизирующие очереди требуется просто скопировать каждый МОП в конец нужной очереди. Для перемещения МОПов из этих очередей в очереди (буфера) планировщика нужно выбрать соответствующую очередь по типу операции, а в случаях, когда подходят две очереди (Fast0 и Fast1 для сложения/вычитания и копирования) — принять решение, исходя из требования равномерной загрузки очередей. Для выбора инструкции, отсылаемой на исполнение, нужно просмотреть очереди, приписанные к данному порту, и найти в них МОП, готовый к исполнению (т.е. такой МОП, все операнды которого уже вычислены либо ожидаются к нужному моменту) с учётом готовности функциональных устройств. При наличии нескольких готовых МОПов выбирается самый старый. Эти действия проводятся независимо в каждом порту. Порты 0 и 1 работают на удвоенной частоте. В связи с повышенной тактовой частотой, особенно с учётом работы двух портов на удвоенной частоте,h2h2 в процессоре P-4 применён нестандартный подход для осуществления диспетчеризации (отсылки МОПа на исполнение). Принятие решения о диспетчеризации в любом процессоре проводится за некоторое время до попадания операции в функциональное устройство. Это связано в первую очередь с тем, что операнды МОПа должны быть предварительно считаны из регистров (либо приняты из других функциональных устройств, от результатов работы которых зависит данная операция). Поэтому между моментами диспетчеризации и запуска на исполнение имеется один или несколько промежуточных этапов — обозначим их количество как N1. В свою очередь, продолжительность выполнения операции в функциональном устройстве может составлять один или несколько тактов — обозначим их число как N2. По завершении операции её результат может быть немедленно передан на вход другой операции, зависимой от этой, непосредственно перед началом её исполнения в функциональном устройстве. Непосредственно перед попаданием любой операции в функциональное устройство производится окончательная проверка готовности ожидаемых операндов. В случае их неготовности (например, из-за отсутствия считываемых данных в L1-кэше) операция помечается как недействительная, МОП этой операции не удаляется из очереди планировщика, и результаты её выполнения никуда не передаются. Рассмотрим теперь следующий пример. Предположим, что некая операция поступает в функциональноеh2 устройство (ФУ), и результат её выполнения является операндом другой (зависимой) операции. Для наиболее эффективного исполнения потокаh2операций необходимо, чтобы эта зависимая операция прошла диспетчеризациюh2 через N2 тактов после первой и стартовала в функциональном устройстве тоже через N2 тактов после первой. В этом случае результаты первой операцииh2h2 будут готовы (на выходе из ФУ) как раз к тому моменту, когда вторая операция попадёт на вход в ФУ. Однако в силу того, что первая операция тоже могла зависеть от прихода каких-то других данных, вторая операция должна быть диспетчеризована не ранее, чем будет подтвержденаh2 готовность операндов для первой (чтобы гарантировать корректность её результатов, необходимых для исполнения второй операции). Так как между моментами диспетчеризации и проверки готовности (запуска)h2проходит N1 тактов, для соблюдения данного условия требуется выполнениеh2h2 неравенства N1<=N2. Например, в процессоре AMD K8h2h2 для операций ALU/AGU N1=N2=1, а для операций FPU N1=N2=2h2h2 (здесь указаны минимальные значения N2). В процессоре P-4 время выполнения самых коротких операций составляет всего 0.5 такта (за счёт работы соответствующих ФУ на удвоенной частоте). За такое короткое время невозможноh2 произвести все необходимые подготовительные действияh2 перед запуском операции в ФУ. Поэтому неравенство N1<=N2 неh2 выполняется, и диспетчеризация зависимой операции может бытьh2 проведена до подтверждения готовности операндов операции, отh2 которой она зависит. Разумеется, перед попаданием в ФУ любаяh2 операция, не получившая операндов, будет помечена как недействительная.h2 Однако подобный «холостой» запуск (с необходимостью повторногоh2 исполнения в будущем) будет произведён не только для первой операции,h2 которая не успела своевременно получить свои операнды, но и дляh2 второй, которая от неё зависит (так как решение о её запускеh2 уже принято), а также для всех последующих операций в «зависимойh2 цепочке» — при условии, что они поступают в очередь планировщика плотным потоком, без достаточных временных интервалов. Рис. 7 На Рис. 7 показаны примеры для случаев N1=N2 (слева) и N1>N2 (справа). В первом случае диспетчеризация операции 2 производится корректно, в тот момент, когда операция 1 попадает в ФУ. Во втором случае диспетчеризация операции 2 производится в момент времени t+N2, то есть раньше, чем операция 1 попадёт в ФУ (это произойдёт позднее, в момент времени t+N1). Точное значение числа промежуточных этапов конвейера в процессоре P-4 неизвестно, но для примера можно предположить, что оно равно трём для обычных операций (это согласуется со схемой конвейера, приведённой в документации по процессору), и шести — для операций, исполняемых на удвоенной частоте. Если сохранять все диспетчеризованные операции в очередях (буферах) планировщика, как это делается в традиционных процессорах, и удалять их оттуда только в момент успешного запуска на исполнение, то длину каждой очереди придётся увеличить как минимум на шесть (сверх нынешней длины, равной восьми для очередей Fast0 и Fast1). Поскольку для порта запуска такая очередь является полностью ассоциативным буфером, поиск и извлечение нужного элемента из которого нужно осуществить всего за половину такта, подобное усложнение разработчики сочли неоправданным. Вместо этого они реализовали альтернативную схему. Суть её заключается в том, что в момент диспетчеризации МОП удаляется из очереди планировщика, но его копия помещается в другую очередь, представляющую собой линию задержки с продвижением МОПа вдоль неё в каждом такте (полутакте). Если к моменту прихода МОПа в ФУ подтверждается его корректность (то есть готовность всех операндов), то соответствующий ему элемент удаляется из линии задержки. В противном случае он продолжает продвижение по ней и через предусмотренное число тактов вновь поступает на вход функционального устройства для повторного исполнения. Поскольку основной причиной неготовности данных является их отсутствие в L1-кэше, то в большинстве случае достаточно задержать соответствующую инструкцию (а также все зависимые от неё) на промежуток времени, достаточный для считывания этих данных из L2-кэша. Поэтому и дополнительная длина линии задержки выбрана равной времени выборки из L2-кэша. Механизму отсылки некорректных операций в линию задержки на фиксированный промежуток времени с их последующим безусловным запуском на исполнение разработчики дали название «реплей» (replay), а линии задержки назвали «петлями реплея». Этот механизм кажется простым и элегантным выходом из положенияh2h2h2h2h2 в ситуации, когда N1>N2. Он не избавляет от необходимости перевыполнятьh2h2h2h2h2 все операции в зависимой цепочке, однако экономит ресурсы и упрощает организацию системы внеочередного исполнения, позволяя тем самым обеспечить работу на повышенной тактовой частоте (и даже на удвоенной частоте). Однако работа этого механизма может привести к повторным попаданиям инструкции в петлю реплея в случаях, когда данные не оказались доступными после завершения первой петли. Например, при отсутствии требуемых данных в L2-кэше может потребоваться многократное прохождение петли реплея в ожидании их считывания из памяти. Несмотря на то, что повторные петли реплея выполняются с большим периодом, это может привести к неоправданному расходу ресурсов планировщика и ФУ (данная проблема частично снята в процессоре P-4E, где зависимые цепочки МОПов, ожидающих данных из памяти, перемещаются в отдельную асинхронную очередь). Другая неприятность связана с тем, что последующие МОПы в зависимой цепочке могут вовлекаться в реплей даже, несмотря на то, что начальные МОПы уже получили свои данные и корректно выполнились. Причиной этому является то обстоятельство, что каждый конкретный МОП зависит только от своего непосредственного предшественника в зависимой цепочке. Подобные эффекты многократного прохождения МОПов по петлям реплея получили в литературе название «торнадо». Число МОПов, попавших на повторное исполнение (однократное либо многократное), может достигать на реальных приложениях 35 процентов от общего числа операций в программе (этот пример соответствует программе-архиватору RAR, исполняемой на процессоре P-4 Northwood). В других программах этот показатель ниже. В программах с использованием плавающей арифметики реплей наблюдается намного реже. В процессоре P-4E (Prescott) проведён ряд серьёзных модификаций, позволивший во многих случаях заметно снизить попадания операций в петли реплея. Помимо основного эффекта от реплея, наблюдается и побочный в случаях двухпоточного исполнения процессов в режиме HyperThreading. В этом случае один процесс, подверженный частому реплею, может снижать производительность другого процесса из-за того, что он занимает функциональные устройства процессора. Количественно оценить влияние данной реализации системы реплея на производительностьh2 довольно трудно. Процессор P-4 имеет избыточное количество функциональныхh2устройств, позволяющих, например, выполнять по четыре целочисленные операции в каждом такте (при темпе работы трактов выборки и отставкиh2 инструкций, равном трём). Такая избыточность позволяет несколько сгладить отрицательные эффекты. Кроме того, исполнение петли реплея приh2 отсутствии данных в L1-кэше может происходить в момент неизбежного простоя устройств процессора, что тоже несколько нейтрализует потери. Поэтому нельзя сделать однозначных выводов о масштабе снижения производительности.h2h2 Наверное, как и для других подсистем процессора P-4, можно предположить, что данная система работает эффективно на оптимизированныхh2 программах, в которых упорядочены обращения к иерархиям памятиh2 и аккуратно спланированы зависимые операции. А на программах, содержащих большое число плотных зависимых цепочек, косвенных ссылок, нерегулярных условных переходов и косвенных переходов по меняющимся адресам, может проявляться определённое снижение производительности, обусловленное реплеем и его следствиями. |