Как написать предсказатель локальной ветви?

#cpu-architecture #branch-prediction

#архитектура процессора #прогнозирование развития отрасли

Вопрос:

Я пытаюсь с помощью runspec протестировать свой предсказатель локальной ветви, но получаю только неутешительный результат. К настоящему времени я попытался использовать 64 термина LHT, и когда LHT заполнен, я использую FIFO, чтобы заменить термины в LHT.Я не знаю, использую ли я крошечный LHT или моя неправильная тактика замены делает его ужасной точностью, в любом случае, это всего лишь 60,9095.

 for (int i = 0; i lt; 1 lt;lt; HL; i  )  {  if (tag_lht[i] == (addramp;(1-(1lt;lt;HL))))  {  addr = addr ^ LHT[i].getVal();  goto here;  break;  }  }  index_lht = index_lht%(1lt;lt;HL);  tag_lht[index_lht] = (addramp;(1-(1lt;lt;HL)));  LHT[index_lht] = ShiftReglt;2gt;();  addr = addr ^ LHT[index_lht].getVal();  index_lht  ; here:  for (int i = 0; i lt; 1 lt;lt; L; i  )  {  if (tag[i] == (addr))  {  return bhist[i].isTaken();  }  }  index = index % (1 lt;lt; L);  tag[index] = (addr);  bhist[index].reset();  return bhist[index  ].isTaken();  

Здесь я немного объясняю код. bhist-это 2-битный статус хранилища таблиц для каждой ветви. Когда таблица заполнена, используйте тактику замены FIFO. тег-это место, где в таблице хранится адрес каждой инструкции. Кроме того, скорее всего, я использую tag_lht для хранения адреса каждой инструкции, хранящейся в LHT. Функция isTaken() может легко получить прогнозируемый результат.

Комментарии:

1. Извините, недостаточно подробностей для понимания. Отсутствует окружающий контекст этого кода (т. е. вся функция) и объявления данных (типы и глобалы), а также, возможно, один или два комментария и даже диаграмма, объясняющая, как связаны различные таблицы.

2.Примечание: for (int i = 0; i lt; 1 lt;lt; HL; i ) —gt;gt;gt;gt;gt; for (int i = 0; i lt; (1 lt;lt; HL); i )

3. @wildplasser, это может улучшить читаемость, но lt; имеет более низкий приоритет, чем lt;

4. (addramp;(1-(1lt;lt;HL))); —lt;lt; Я ожидал (addramp;((1ult;lt;HL) -1 )); бы здесь , предполагая, что вы намерены извлечь младшие биты в качестве тега.

Ответ №1:

Спасибо всем вам, ребята, я нахожу, что совершаю глупую ошибку, и приведенный выше код верен, но может показаться, что префект не работает. Ошибка ниже:

 for (int i = 0; i lt; (1 lt;lt; L); i  )  {   if (tag[i] == (addr))  {  if (takenActually)  {  LHT[j].shiftIn(1);  bhist[i].increase();  }  else  {  LHT[j].shiftIn(0);  bhist[i].decrease();  }  }  break;  }  

Но так и должно быть:

для (int i = 0; i lt; (1 lt;

 if (tag[i] == (addr))  {  if (takenActually)  {  LHT[j].shiftIn(1);  bhist[i].increase();  }  else  {  LHT[j].shiftIn(0);  bhist[i].decrease();  }  break;  }  }  

Я настолько глуп, что трачу время ваших полезных людей, я потратил так много времени, чтобы понять, почему это не работает, сначала я думал, что используются неправильные переменные или аргументы, теперь я просто думаю, что я неосторожный человек. Еще раз благодарю всех вас, пылкие ребята. Тогда я отвечу на вопрос своим полным кодом. PS. желаю, чтобы мой ужасный английский никого не смутил.:)