Предыдущий пост темы здесь.
Как же он все-таки работает:
Рассмотрим алгоритм работы современного процессора. Ради облегчения понимания мы значительно упростим схему и опишем лишь функции крупных блоков ЦП, не вдаваясь в технические детали.
1. Условно говоря, работа процессора начинается с запроса очередной команды. Блок выборки, зная, по какому адресу расположена команда, пытается найти ее в кэше L1. Не обнаружив ее там, он обращается к кэшу L2 (который больше по объему и хранит больше ранее запрошенных команд и данных), если и там ее нет – к еще более вместительному L3.
Если же искомая команда отсутствует и в кэше L3, она загружается через шину данных процессора из системной памяти, по пути попадая во все три кэша. Сходным образом запрашиваются и данные, требующиеся для выполнения этой команды.
2. Блок выборки передает команду в декодер. Этот узел нужен для того, чтобы разложить сложную команду системы команд x86 на несколько микроопераций, каждая из которых выполняется исполнительными устройствами за один такт.
Получившуюся последовательность микроопераций декодер помещает в кэш декодированных команд. Блоку выборки нужна следующая команда. Для того чтобы узнать, откуда брать следующую команду и данные для нее, задействуется блок предвыборки. Анализируя последовательность микроопераций, он определяет, какая команда понадобится далее.
3. Планировщик забирает из кэша декодированных команд несколько микроопераций и определяет, в какой последовательности их можно выполнять. Команды, результаты выполнения которых не зависят от результатов выполнения других команд, могут исполняться параллельно на разных исполнительных устройствах.
Таких устройств в ядре современного процессора немало: ALU для целых чисел, FPU для чисел с плавающей запятой, ALU для команд SSE и множество других.
4. На этом этапе возможно определение ошибки предвыборки. К примеру, если исполняемая операция является командой условного перехода (то есть результат зависел от содержимого одного из регистров), блок
предвыборки, не имея возможности узнать, каким будет значение регистра на момент исполнения команды, может ошибочно предположить, что переход осуществится (тогда как на самом деле его не должно быть), и предложит блоку выборки неверный адрес следующей команды.
То же касается предвыборки данных: если на момент исполнения команды загрузки или выгрузки данных значения регистров, содержащих адрес этих данных, будут иными, нежели в момент предвыборки, будет зафиксирована ошибка предвыборки, поскольку в кэш попали неверные данные.
В этом случае конвейер очищается, а блок выборки снова запрашивает команду, предшествующую моменту совершения ошибки.
Разумеется, очистка, и повторное заполнение конвейера ведут к потере времени. И если при исполнении программы совершается множество ошибок предвыборки, производительность процессора заметно снижается. Тем не менее, средняя эффективность предвыборки в современных ЦПУ достигает 90–95%.
5. Если команда на выходе с конвейера признана выполненной корректно (то есть ошибки предвыборки не было), ее результат помещается в кэш и далее попадает в системную память компьютера.
Источник: по материалам журнала ComputerBild