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