Статья Википедии на EPIC уже наметила много опасностей , общих для VLIW и EPIC.
Если кто-то не уловил чувства фатализма из этой статьи, позвольте мне подчеркнуть это:
Ответы загрузки из иерархии памяти, которая включает в себя кэши ЦП и DRAM, не имеют детерминированной задержки.
Другими словами, любая аппаратная конструкция, которая не справляется с (*) недетерминированной задержкой при доступе к памяти, просто станет впечатляющим провалом.
(*) Чтобы справиться с необходимостью, необходимо добиться достаточно хорошей производительности выполнения (иными словами, «конкурентоспособной по стоимости»), что исключает необходимость частого простоя процессора в течение десятков или сотен циклов.
Обратите внимание, что стратегия преодоления, используемая EPIC (упомянутая в статье в Википедии, ссылки на которую приведены выше), фактически не решает проблему. Это просто говорит о том, что бремя указания зависимости данных теперь ложится на компилятор. Все в порядке; компилятор уже имеет эту информацию, поэтому компилятору просто выполнить его. Проблема в том, что процессор все еще будет простаивать в течение десятков или сотен циклов при обращении к памяти. Другими словами, он экстернализует вторичную ответственность, но по-прежнему не справляется с основной ответственностью.
Вопрос можно перефразировать следующим образом: «Учитывая аппаратную платформу, которая обречена на провал, почему (1) не (2) не могли авторы компилятора героически приложить усилия, чтобы выкупить ее?»
Я надеюсь, что мое перефразирование сделает ответ на этот вопрос очевидным.
Существует второй аспект неудачи, который также является фатальным.
Стратегии копирования (упомянутые в той же статье) предполагают, что программная предварительная выборка может использоваться для восстановления хотя бы части потери производительности из-за недетерминированной задержки при доступе к памяти.
В действительности, предварительная выборка выгодна, только если вы выполняете потоковые операции (чтение памяти последовательным или очень предсказуемым образом).
(Тем не менее, если ваш код делает частый доступ к некоторым локализованным областям памяти, кэширование поможет.)
Тем не менее, большинство универсального программного обеспечения должно иметь много случайных обращений к памяти. Если мы рассмотрим следующие шаги:
- Рассчитайте адрес, а затем
- Прочитайте значение, а затем
- Используйте это в некоторых расчетах
Для большинства универсального программного обеспечения эти три должны выполняться в быстрой последовательности. Другими словами, не всегда возможно (в рамках логики программного обеспечения) рассчитать адрес заранее или найти достаточно работы, чтобы заполнить ларьки между этими тремя шагами.
Чтобы объяснить, почему не всегда можно найти достаточно работы, чтобы заполнить киоски, вот как можно это визуализировать.
- Допустим, чтобы эффективно скрывать киоски, нам нужно заполнить 100 инструкций, которые не зависят от памяти (поэтому не будут страдать от дополнительной задержки).
- Теперь, как программист, пожалуйста, загрузите любое программное обеспечение по вашему выбору в дизассемблер. Выберите случайную функцию для анализа.
- Можете ли вы определить где-нибудь последовательность из 100 инструкций (*), которые не имеют доступа к памяти?
(*) Если бы мы могли сделать NOP
полезную работу ...
Современные процессоры пытаются справиться с тем же, используя динамическую информацию - одновременно отслеживая ход выполнения каждой инструкции по мере ее передачи по конвейерам. Как я упоминал выше, часть этой динамической информации обусловлена недетерминированной задержкой памяти, поэтому компиляторы не могут предсказать ее с какой-либо степенью точности. В общем, во время компиляции просто недостаточно информации для принятия решений, которые могли бы заполнить эти киоски.
В ответ на ответ А.П.Программер
Дело не в том, что «компилятор ... извлекать параллелизм сложно».
Переупорядочение памяти и арифметических инструкций современными компиляторами свидетельствует о том, что у него нет проблем с идентификацией операций, которые независимо и, следовательно, выполняются одновременно.
Основная проблема заключается в том, что недетерминированная задержка памяти означает, что любая «пара сопряжения», закодированная для процессора VLIW / EPIC, в конечном итоге будет остановлена доступом к памяти.
Оптимизация инструкций, которые не блокируются (только регистр, арифметика), не помогут с проблемами производительности, вызванными инструкциями, которые с большой вероятностью блокируются (доступ к памяти).
Это пример отказа от применения правила 80-20 оптимизации: оптимизация уже быстрой работы не приведет к значительному улучшению общей производительности, если не оптимизировать более медленную.
В ответ на ответ Василия Старынкевича
Это не «... (что бы то ни было) трудно», это то, что EPIC не подходит для любой платформы, которая должна справляться с высоким динамизмом в задержке.
Например, если процессор имеет все следующее:
- Нет прямого доступа к памяти;
- Любой доступ к памяти (чтение или запись) должен быть запланирован с помощью передачи DMA;
- Каждая инструкция имеет одинаковую задержку выполнения;
- Выполнение заказа;
- Широкие / векторизованные исполнительные блоки;
Тогда VLIW / EPIC подойдет.
Где найти такие процессоры? DSP. И здесь процветал VLIW.
Оглядываясь назад, неудача Itanium (и продолжающиеся усилия по НИОКР в неудачу, несмотря на очевидные доказательства) является примером организационной неудачи и заслуживает глубокого изучения.
Конечно, другие проекты вендора, такие как гиперпоточность, SIMD и т. Д., Кажутся весьма успешными. Вполне возможно, что инвестиции в Itanium могли оказать благотворное влияние на навыки его инженеров, что, возможно, позволило им создать успешную технологию следующего поколения.