Re[8]: Эльбрус - 8 ядер
От: Kernighan СССР  
Дата: 04.06.17 14:15
Оценка:
Здравствуйте, 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 командах тоже встретится условный переход
Отредактировано 04.06.2017 15:40 Kernighan . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.