#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. желаю, чтобы мой ужасный английский никого не смутил.:)