Прогнозирование малых ветвей (не домашнее задание)
Это НЕ домашнее задание. Я читал этот сайт, который, IMO, имеет довольно хорошее введение в прогнозирование ветвлений, и решил попробовать решить проблему после лекции:
рассмотрим следующий код [нет интервалов задержки ветвления]:
add $2, $0, $0 addi $11, $0, 5 addi $12, $0, 3 outer: addi $2, $2, 1 add $1, $0, $0 inner: addi $1, $1, 1 bne $1, $11, inner bne $2, $12, outer
Первая инструкция добавления находится по адресу 0.
- какова вероятность неправильного прогнозирования, если мы просто используем таблицу истории паттернов с 2 записями? [уровень неправильного прогноза = # неправильных прогнозов / # прогнозов]
- Что если мы используем предиктор локальной истории с таблицей локальной истории из 2 записей и таблицей истории из 4 записей?
Во-первых, мне интересно, если в условии есть ошибка, и обе инструкции добавления должны, как и остальные, быть добавлены с немедленным 0 вместо $0. Может кто-нибудь знакомый с темой прокомментировать это?
Во-вторых, я попытался решить эту проблему (рассматривая add как addi с немедленным 0, как упомянуто выше), и считая, что начальное состояние насыщенных счетчиков строго не принимается. Мои ответы были:
для 1. уровень неправильного прогноза 8/10 (8 неверных прогнозов, 10 прогнозов)
для 2. уровень неправильных прогнозов 13/5 (13 ошибочных прогнозов, 5 прогнозов)
Может кто-нибудь, знакомый с предметом, дать ему проверку? Просто интересно, действительно ли я понял материал лекции. Благодарю.
1 ответ
$0 (также r0 или $ ноль) - это регистр, который всегда равен нулю. Удобен для сравнения и установки переменных, в вашем примере он используется для установки переменных. Обратите внимание, что "add $2, $0, $0" эквивалентно "addi $2, $0, 0", которое (в C-образной записи) "$2 = 0;". Одно и то же выражение, закодированное с использованием разных форматов инструкций mips (R и I соответственно)
Если бы мы написали этот ассемблерный код в стиле C, он бы выглядел примерно так:
$11 = 5;
$12 = 3;
$2 = 0;
while ($2 != $12){
$2++;
$1 = 0;
while ($1 != $11)
$1++;
}
Надеюсь это поможет.