Прогнозирование малых ветвей (не домашнее задание)

Это НЕ домашнее задание. Я читал этот сайт, который, 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.

  1. какова вероятность неправильного прогнозирования, если мы просто используем таблицу истории паттернов с 2 записями? [уровень неправильного прогноза = # неправильных прогнозов / # прогнозов]
  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++;
    }

Надеюсь это поможет.

Другие вопросы по тегам