В чем преимущество планирования инструкций компилятора по сравнению с динамическим планированием?
В настоящее время суперскалярные процессоры RISC обычно поддерживают выполнение не по порядку, с предсказанием переходов и спекулятивным выполнением. Они планируют работу динамически.
В чем преимущество планирования команд компилятора по сравнению с динамическим планированием внеочередного ЦП? Имеет ли значение статическое планирование во время компиляции вообще для ЦП, вышедшего из строя, или только для простых ЦП?
Кажется, что в настоящее время большинство программных инструкций по планированию сосредоточено на VLIW или простых процессорах. Страница планирования вики GCC также не проявляет особого интереса к обновлению алгоритмов планирования gcc.
2 ответа
Преимущество статического (компиляторного) планирования:
- Нет ограничений по времени, поэтому можно использовать очень сложные алгоритмы;
- Нет ограничений в окне инструкций. Это позволяет, например, обмениваться инструкцией с целым циклом вызова функции.
Преимущество динамического (процессорного планирования):
- Позаботьтесь о реальной среде (кеш, арифметический блок занят из-за другой гиперпотоки);
- Не заставляйте перекомпилировать код для каждого обновления архитектуры.
Это все, что я могу думать сейчас.
Во-первых, я должен отметить, что текущие архитектуры RISC сначала компилируются, затем выполняют перепланирование, потому что команды сборки "высокого уровня" компилируются в меньшие команды RISC. По крайней мере, это верно для архитектуры x86/x64.
Тогда мы можем представить цикл выполнения следующим образом: компилировать - оптимизировать / перепланировать - уменьшить масштаб - компилировать - оптимизировать / перепланировать.
Такого рода ответы на вопрос, компилятор имеет гораздо более широкую область видимости в приложении, поэтому он в основном оптимизируется на макроуровне (блоки команд приложения), в то время как процессор в основном оптимизируется на микроуровне (блоки команд RISC).