Здравствуйте, Философ, Вы писали:
Ф> Всё-таки лучше переупорядочивать на этапе компиляции — мне кажется, что тут больше возможностей — тут легче загрузить конвеер(Ы).
Хрен там:
1) Представим себе, что есть команда, которая выполняется 100 тактов. Ну там, согласно гайдам x86 у них деление 128/64 выполняется 90. А все остальные выполняются ну до 10 тактов самая сложная. Параллельная группа команд будет выполняться по времени самой долгой, пока она не закончится — все ждут. Кем жертвовать будем?
Наверно, именно из этих соображений из IA64 как раз убрали целочисленное деление. Рисуйте циклы, ребятки (а то, что этот цикл займёт ещё больше времени и к нему не пристроишь другие действия — не проблемы шерифа).
А в OoO проблем нет: пока одно АЛУ хрустит рукояткой
арифмометра "Феликс", вычитая по делителю и затем сдвигая его, остальные команды пролетают мимо, и есть шанс, что можно сделать, что никто никого ждать не будет (в реале, конечно, почти никогда не получается идеально, но думать непродумываемое не приходится).
2) Ещё хуже с доступом к памяти: напоминаю, если строки кэша нет ни в одном из L1, L2, L3, запрос идёт в DRAM, а DRAM модуль должен менять строку — прощайте, 100-200-300 тактов. И снова: вот в параллельной группе все получили данные из кэша, а одна ждёт... и все ждут отстающую.
Тут немножко поможет prefetch. Потому и бенчмарки для Эльбруса стараются показывать на потоковой обработке через SIMD, где это возможно. А на другом коде результаты сразу будут в разы хуже, чем у конкурентов с честным OoO: вечно что-то пропадает из кэша в самый интересный момент, и когда на OoO одна соответствующая команда тормозит, на EPIC тормозит вся группа.
Ф>А ведь мне сама идея VLIW нравилась — что-то в этом есть интересное: суперскалярные архитектуры очень сложные — даже просто понять как работает переупорядочивание сложно, а переименование регистров умножает эту сложность кратно. Спекулятивное исполнение вкупе с BTB — вообще заумь. Не нужно быть семи пядей во лбу чтобы предсказать существование ошибок в этих системах — слишком сложно. И они потом, само собой, нашлись — BranchScope, Spectre.
Это вообще не ошибки. Это естественные побочные эффекты изменения времени работы от кэширования. Кэширование сокращает время — но это сокращение можно увидеть со стороны. EPIC (VLIW) будет страдать тем же, просто нет процессоров, где бы этот эффект измерили.
Я в который раз уже говорю — я не понимаю, почему Эльбрусы не комплектуются SRAM вместо DRAM. Разница в цене для вояк будет пофиг, а хотя бы от чудовищных задержек на переоткрытие строки можно будет избавиться (и соответственно сократить всю машину кэшей памяти).