Параллелизм на уровне инструкций ( ILP ) — это параллельное или одновременное выполнение последовательности инструкций в компьютерной программе . Более конкретно, ILP относится к среднему числу инструкций, выполняемых на шаг этого параллельного выполнения. [2] : 5
ILP не следует путать с параллелизмом . В ILP есть один определенный поток выполнения процесса . С другой стороны, параллелизм подразумевает назначение нескольких потоков ядру ЦП в строгом чередовании или в истинном параллелизме, если имеется достаточно ядер ЦП, в идеале одно ядро для каждого исполняемого потока.
Существует два подхода к параллелизму на уровне инструкций: аппаратный и программный .
Аппаратный уровень работает на динамическом параллелизме, тогда как программный уровень работает на статическом параллелизме. Динамический параллелизм означает, что процессор решает во время выполнения, какие инструкции выполнять параллельно, тогда как статический параллелизм означает, что компилятор решает, какие инструкции выполнять параллельно. [3] [ необходимо разъяснение ] Процессор Pentium работает на динамической последовательности параллельного выполнения, но процессор Itanium работает на статическом уровне параллелизма.
Рассмотрим следующую программу:
е = а + бф = с + гм = е * ж
Операция 3 зависит от результатов операций 1 и 2, поэтому ее нельзя вычислить, пока обе они не будут завершены. Однако операции 1 и 2 не зависят ни от какой другой операции, поэтому их можно вычислить одновременно. Если предположить, что каждая операция может быть завершена за одну единицу времени, то эти три инструкции могут быть завершены в общей сложности за две единицы времени, что дает ILP 3/2.
Цель разработчиков компиляторов и процессоров — выявить и использовать как можно больше ILP. Обычные программы обычно пишутся в рамках модели последовательного выполнения, где инструкции выполняются одна за другой и в порядке, указанном программистом. ILP позволяет компилятору и процессору перекрывать выполнение нескольких инструкций или даже изменять порядок выполнения инструкций.
То, сколько ILP существует в программах, очень зависит от приложения. В некоторых областях, таких как графика и научные вычисления, количество может быть очень большим. Однако рабочие нагрузки, такие как криптография, могут демонстрировать гораздо меньший параллелизм.
Микроархитектурные методы, используемые для эксплуатации ILP, включают:
Известно, что ILP используется как компилятором, так и аппаратной поддержкой, но компилятор также предоставляет встроенный и неявный ILP в программах для оборудования посредством оптимизации времени компиляции. Некоторые методы оптимизации для извлечения доступного ILP в программах включают планирование инструкций , распределение /переименование регистров и оптимизацию доступа к памяти.
Архитектуры потоков данных — это еще один класс архитектур, в которых ILP указан явно. Недавний пример см. в архитектуре TRIPS .
В последние годы методы ILP использовались для повышения производительности, несмотря на растущее несоответствие между рабочими частотами процессоров и временем доступа к памяти (ранние разработки ILP, такие как IBM System/360 Model 91, использовали методы ILP для преодоления ограничений, налагаемых относительно небольшим файлом регистров). В настоящее время штраф за пропуск кэша в основной памяти стоит несколько сотен циклов ЦП. Хотя в принципе возможно использовать ILP для того, чтобы выдерживать даже такие задержки памяти, связанные с этим затраты на ресурсы и рассеивание мощности несоразмерны. Более того, сложность и часто задержка базовых аппаратных структур приводит к снижению рабочей частоты, что еще больше снижает любые преимущества. Следовательно, вышеупомянутые методы оказываются недостаточными для предотвращения остановки ЦП из-за данных вне чипа. Вместо этого отрасль движется к использованию более высоких уровней параллелизма, которые могут быть использованы с помощью таких методов, как многопроцессорность и многопоточность . [4]