Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, Kernighan, Вы писали:
K>>Неправильно!
K>>CPU всегда исполняет ОДНУ ветку. Ту, которую он считает более вероятной.
C>Это так обычный предсказатель переходов работает. А современные Intel именно что исполняют обе ветки, хотя предсказанная ветка пойдёт дальше.
Современный Интел делает именно так, как я сказал.
Тебе надо было пять минут подумать. А ты не подумал.
За то, что не подумал, будешь порот.
K>>А если не угадал, то откатывает результаты.
K>>Достаточно подумать пять минут, чтобы понять, почему это лучше.
C>Проблема тут в том, что при неправильном предсказании CPU должен будет переделать всю работу. В случае параллельного исполнения одна ветка просто будет отброшена.
По словам "переделать всю работу" сразу видно, что ты не понимаешь, о чём говоришь.
C>Минус в том, что глубина предсказания ограничена (на практике одним уровнем) и требуется больше ALU на выполнение ненужных операций (которые можно было бы израсходовать на ещё одно ядро).
Ну разумеется. И поэтому ВСЕГДА предпочитают сделать ещё одно ядро, а не то, что ты тут нафантазировал.
Итак, что происходит на самом деле.
Процессор исполняет программу и в коде программы встречает условный переход.
Процессор не знает, куда пойдёт исполнение — прямо или по направлению перехода.
Есть хорошая эвристика — переходы назад всегда исполняются (потому что это цикл),
А переходы вперёд никогда не исполняются (потому что большинство условий — это обработка нереальных ошибок).
Эта эвристика позволяет угадать 90% случаев.
Остальные случаи угадываются за счёт того, что помнится направление перехода в этом месте в прошлый раз.
Но мы это рассматривать не будем. Просто поверим в то, что предсказатель в 90% (или больше) предсказывает правильно.
Теперь мы стоим перед выбором — что делать: выполнять одну ветку или обе?
Пусть процессор имеет 4 АЛУ, которые можно загрузить операциями.
И пусть направление перехода мы узнаем через три такта.
В случае, если мы все 4 АЛУ отдали под главную ветку, мы выполним 12 операций и с 90% вероятностью угадаем.
В случае, если мы 2 АЛУ отдали под одну ветку, а 2 под другую, то мы выполним только 6 операций нужной ветки.
Да, при втором варианте мы никогда не ошибёмся, но в первом варианте мы в 90% выполняем в два раза больше операций.
Поэтому всегда выбирается первая схема. Она и более простая и более эффективная.
Причём, чем лучше предсказывает предсказатель, тем меньше нужна вторая ветка.
В случае,если мы не угадали направление перехода ничего
переделывать не надо.
Запущенные операции идут через АЛУ как шли.
Просто результаты выполненных операций не пишутся в регистры.
Поскольку конвейер у нас выполняет все операции за одно число тактов,
то к моменту записи мы уже знаем, произошёл переход или нет.
Так работает любой нормальный суперскалярный RISC (и с перестановкой и без перестановки команд).
VLIV-ы я не разрабатывал, но наверное и там всё так же.
Могу рассказать, что произойдёт, если в этих 12 командах тоже встретится условный переход